Cataclysm BN
game Class Reference

#include <game.h>

Classes

class  Creature_range
 
class  debug_hour_timer
 
class  draw_callback_t
 
class  monster_range
 
class  non_dead_range
 
class  npc_range
 

Public Member Functions

 game ()
 
 ~game ()
 
void load_static_data ()
 Loads static data that does not depend on mods or similar. More...
 
std::string get_player_base_save_path () const
 Base path for saving player data. More...
 
std::string get_world_base_save_path () const
 Base path for saving world data. More...
 
void on_options_changed ()
 Should be invoked whenever options change. More...
 
void setup ()
 
void serialize (std::ostream &fout)
 Saving and loading functions. More...
 
void unserialize (std::istream &fin)
 
void unserialize_master (std::istream &fin)
 
bool dump_stats (const std::string &what, dump_mode mode, const std::vector< std::string > &opts)
 write statistics to stdout and More...
 
bool save ()
 Returns false if saving failed. More...
 
std::vector< std::string > list_active_characters ()
 Returns a list of currently active character saves. More...
 
void write_memorial_file (const std::string &filename, std::string sLastWords)
 Writes information about the character out to a text file timestamped with the time of the file was made. More...
 
bool cleanup_at_end ()
 
void start_calendar ()
 
bool do_turn ()
 MAIN GAME LOOP. More...
 
shared_ptr_fast< ui_adaptorcreate_or_get_main_ui_adaptor ()
 
void invalidate_main_ui_adaptor () const
 
void mark_main_ui_adaptor_resize () const
 
void draw ()
 
void draw_ter (bool draw_sounds=true)
 
void draw_ter (const tripoint &center, bool looking=false, bool draw_sounds=true)
 
void add_draw_callback (shared_ptr_fast< draw_callback_t > cb)
 
void draw_panels (bool force_draw=false)
 
cata::optional< tripointget_veh_dir_indicator_location (bool next) const
 Returns the location where the indicator should go relative to the reality bubble, or nothing to indicate no indicator should be drawn. More...
 
void draw_veh_dir_indicator (bool next)
 
void vertical_move (int z, bool force, bool peeking=false)
 Moves the player vertically. More...
 
void start_hauling (const tripoint &pos)
 
cata::optional< tripointfind_or_make_stairs (map &mp, int z_after, bool &rope_ladder, bool peeking)
 Returns the other end of the stairs (if any). More...
 
void vertical_shift (int z_after)
 Actual z-level movement part of vertical_move. More...
 
void vertical_notes (int z_before, int z_after)
 Add goes up/down auto_notes (if turned on) More...
 
void use_computer (const tripoint &p)
 Checks to see if a player can use a computer (not illiterate, etc.) and uses if able. More...
 
template<typename T = Creature>
T * critter_by_id (const character_id &id)
 
template<typename T = Creature>
T * critter_at (const tripoint &p, bool allow_hallucination=false)
 Returns the Creature at the given location. More...
 
template<typename T = Creature>
const T * critter_at (const tripoint &p, bool allow_hallucination=false) const
 
template<typename T = Creature>
shared_ptr_fast< T > shared_from (const T &critter)
 Returns a shared pointer to the given critter (which can be of any of the subclasses of Creature). More...
 
size_t num_creatures () const
 Returns the approximate number of creatures in the reality bubble. More...
 
bool update_zombie_pos (const monster &critter, const tripoint &pos)
 Redirects to the creature_tracker update_pos() function. More...
 
void remove_zombie (const monster &critter)
 
void clear_zombies ()
 Redirects to the creature_tracker clear() function. More...
 
bool spawn_hallucination (const tripoint &p)
 Spawns a hallucination at a determined position. More...
 
bool swap_critters (Creature &, Creature &)
 Swaps positions of two creatures. More...
 
Creature_range all_creatures ()
 Returns an anonymous range that contains all creatures. More...
 
monster_range all_monsters ()
 Same as all_creatures but iterators only over monsters. More...
 
npc_range all_npcs ()
 Same as all_creatures but iterators only over npcs. More...
 
std::vector< Creature * > get_creatures_if (const std::function< bool(const Creature &)> &pred)
 Returns all creatures matching a predicate. More...
 
std::vector< npc * > get_npcs_if (const std::function< bool(const npc &)> &pred)
 
Creatureget_creature_if (const std::function< bool(const Creature &)> &pred)
 Returns a creature matching a predicate. More...
 
bool is_empty (const tripoint &p)
 Returns true if there is no player, NPC, or monster on the tile and move_cost > 0. More...
 
bool is_in_sunlight (const tripoint &p)
 Returns true if p is outdoors and it is sunny. More...
 
bool is_sheltered (const tripoint &p)
 Returns true if p is indoors, underground, or in a car. More...
 
bool revive_corpse (const tripoint &p, item &it)
 Revives a corpse at given location. More...
 
void save_cyborg (item *cyborg, const tripoint &couch_pos, player &installer)
 Turns Broken Cyborg monster into Cyborg NPC via surgery. More...
 
bool cancel_activity_query (const std::string &text)
 Asks if the player wants to cancel their activity, and if so cancels it. More...
 
bool cancel_activity_or_ignore_query (distraction_type type, const std::string &text)
 Asks if the player wants to cancel their activity and if so cancels it. More...
 
void moving_vehicle_dismount (const tripoint &dest_loc)
 Handles players exiting from moving vehicles. More...
 
vehicleremoteveh ()
 Returns the current remotely controlled vehicle. More...
 
void setremoteveh (vehicle *veh)
 Sets the current remotely controlled vehicle. More...
 
int assign_mission_id ()
 Returns the next available mission id. More...
 
npcfind_npc (character_id id)
 Find the npc with the given ID. More...
 
void load_npcs ()
 Makes any nearby NPCs on the overmap active. More...
 
void reload_npcs ()
 Unloads, then loads the NPCs. More...
 
const kill_trackerget_kill_tracker () const
 
void add_npc_follower (const character_id &id)
 Add follower id to set of followers. More...
 
void remove_npc_follower (const character_id &id)
 Remove follower id from follower set. More...
 
std::set< character_idget_follower_list ()
 Get set of followers. More...
 
void validate_npc_followers ()
 validate list of followers to account for overmap buffers More...
 
void validate_mounted_npcs ()
 
void validate_linked_vehicles ()
 validate towed vehicles so they get linked up again after a load More...
 
void validate_camps ()
 validate camps to ensure they are on the overmap list More...
 
void autopilot_vehicles ()
 process vehicles that are following the player More...
 
void catch_a_monster (monster *fish, const tripoint &pos, player *p, const time_duration &catch_duration)
 Picks and spawns a random fish from the remaining fish list when a fish is caught. More...
 
std::unordered_set< tripointget_fishable_locations (int distance, const tripoint &fish_pos)
 Get the contiguous fishable locations starting at fish_pos, out to the specificed distance. More...
 
std::vector< monster * > get_fishable_monsters (std::unordered_set< tripoint > &fishable_locations)
 Get the fishable monsters within the provided fishable locations. More...
 
void fling_creature (Creature *c, const units::angle &dir, float flvel, bool controlled=false, bool suppress_map_update=false)
 Flings the input creature in the given direction. More...
 
float natural_light_level (int zlev) const
 
unsigned char light_level (int zlev) const
 Returns coarse number-of-squares of visibility at the current light level. More...
 
void reset_light_level ()
 
character_id assign_npc_id ()
 
Creatureis_hostile_nearby ()
 
Creatureis_hostile_very_close ()
 
point update_map (player &p)
 
point update_map (int &x, int &y)
 
void update_overmap_seen ()
 
void process_artifact (item &it, player &p)
 
void add_artifact_messages (const std::vector< art_effect_passive > &effects)
 
void add_artifact_dreams ()
 
void peek ()
 
void peek (const tripoint &p)
 
cata::optional< tripointlook_debug ()
 
bool check_zone (const zone_type_id &type, const tripoint &where) const
 
bool check_near_zone (const zone_type_id &type, const tripoint &where) const
 Checks whether or not there is a zone of particular type nearby. More...
 
bool is_zones_manager_open () const
 
void zones_manager ()
 
cata::optional< tripointlook_around (bool force_3d=false)
 
look_around_result look_around (bool show_window, tripoint &center, const tripoint &start_point, bool has_first_point, bool select_zone, bool peeking, bool is_moving_zone=false, const tripoint &end_point=tripoint_zero, bool force_3d=false)
 
void pre_print_all_tile_info (const tripoint &lp, const catacurses::window &w_info, int &line, int last_line, const visibility_variables &cache)
 
void print_all_tile_info (const tripoint &lp, const catacurses::window &w_look, const std::string &area_name, int column, int &line, int last_line, const visibility_variables &cache)
 
void draw_look_around_cursor (const tripoint &lp, const visibility_variables &cache)
 
void extended_description (const tripoint &p)
 Long description of (visible) things at tile. More...
 
void draw_trail_to_square (const tripoint &t, bool bDrawX)
 
item_location inv_map_splice (item_filter filter, const std::string &title, int radius=0, const std::string &none_message="")
 Custom-filtered menu for inventory and nearby items and those that within specified radius. More...
 
bool has_gametype () const
 
special_game_id gametype () const
 
void toggle_fullscreen ()
 
void toggle_pixel_minimap ()
 
void reload_tileset (std::function< void(std::string)> out)
 
void temp_exit_fullscreen ()
 
void reenter_fullscreen ()
 
void zoom_in ()
 
void zoom_out ()
 
void reset_zoom ()
 
void set_zoom (int level)
 
int get_zoom () const
 
int get_moves_since_last_save () const
 
int get_user_action_counter () const
 
bool take_screenshot (const std::string &file_path) const
 Saves a screenshot of the current viewport, as a PNG file, to the given location. More...
 
bool take_screenshot () const
 Saves a screenshot of the current viewport, as a PNG file. More...
 
int get_levx () const
 The top left corner of the reality bubble (in submaps coordinates). More...
 
int get_levy () const
 
int get_levz () const
 
void load_map (const tripoint &pos_sm, bool pump_events=false)
 Load the main map at given location, see map::load, in global, absolute submap coordinates. More...
 
void load_map (const tripoint_abs_sm &pos_sm, bool pump_events=false)
 
overmapget_cur_om () const
 The overmap which contains the center submap of the reality bubble. More...
 
std::vector< npc * > allies ()
 Get all living player allies. More...
 
void set_driving_view_offset (const point &p)
 
void calc_driving_offset (vehicle *veh=nullptr)
 
void toggle_gate (const tripoint &p)
 
void knockback (const tripoint &s, const tripoint &t, int force, int stun, int dam_mult, Creature *source)
 
void knockback (std::vector< tripoint > &traj, int stun, int dam_mult, Creature *source)
 
void draw_bullet (const tripoint &t, int i, const std::vector< tripoint > &trajectory, char bullet)
 
void draw_hit_mon (const tripoint &p, const monster &m, bool dead=false)
 
void draw_hit_player (const Character &p, int dam)
 
void draw_line (const tripoint &p, const tripoint &center_point, const std::vector< tripoint > &points, bool noreveal=false)
 
void draw_line (const tripoint &p, const std::vector< tripoint > &points)
 
void draw_weather (const weather_printable &wPrint)
 
void draw_sct ()
 
void draw_zones (const tripoint &start, const tripoint &end, const tripoint &offset)
 
void draw_critter (const Creature &critter, const tripoint &center)
 
void draw_critter_highlighted (const Creature &critter, const tripoint &center)
 
void draw_cursor (const tripoint &p)
 
void draw_highlight (const tripoint &p)
 
void draw_radiation_override (const tripoint &p, int rad)
 
void draw_terrain_override (const tripoint &p, const ter_id &id)
 
void draw_furniture_override (const tripoint &p, const furn_id &id)
 
void draw_graffiti_override (const tripoint &p, bool has)
 
void draw_trap_override (const tripoint &p, const trap_id &id)
 
void draw_field_override (const tripoint &p, const field_type_id &id)
 
void draw_item_override (const tripoint &p, const itype_id &id, const mtype_id &mid, bool hilite)
 
void draw_vpart_override (const tripoint &p, const vpart_id &id, int part_mod, units::angle veh_dir, bool hilite, const point &mount)
 
void draw_below_override (const tripoint &p, bool draw)
 
void draw_monster_override (const tripoint &p, const mtype_id &id, int count, bool more, Creature::Attitude att)
 
bool is_in_viewport (const tripoint &p, int margin=0) const
 
bool check_safe_mode_allowed (bool repeat_safe_mode_warnings=true)
 Check whether movement is allowed according to safe mode settings. More...
 
void set_safe_mode (safe_mode_type mode)
 
void exam_vehicle (vehicle &veh, const point &cp=point_zero)
 open vehicle interaction screen More...
 
bool forced_door_closing (const tripoint &p, const ter_id &door_type, int bash_dmg)
 
bool load (const std::string &world)
 Attempt to load first valid save (if any) in world. More...
 
bool npc_menu (npc &who)
 Returns true if the menu handled stuff and player shouldn't do anything else. More...
 
bool phasing_move (const tripoint &dest, bool via_ramp=false)
 
bool walk_move (const tripoint &dest, bool via_ramp=false)
 
void on_move_effects ()
 
point place_player (const tripoint &dest)
 
void place_player_overmap (const tripoint_abs_omt &om_dest)
 
unsigned int get_seed () const
 
void set_npcs_dirty ()
 If invoked, NPCs will be reloaded before next turn. More...
 
void set_critter_died ()
 If invoked, dead will be cleaned this turn. More...
 
void mon_info (const catacurses::window &, int hor_padding=0)
 
void mon_info_update ()
 
void cleanup_dead ()
 
bool is_dangerous_tile (const tripoint &dest_loc) const
 
std::vector< std::string > get_dangerous_tile (const tripoint &dest_loc) const
 
bool prompt_dangerous_tile (const tripoint &dest_loc) const
 
void despawn_monster (monster &critter)
 Despawn a specific monster, it's stored on the overmap. More...
 
void win ()
 Marks the game as won. More...
 
bool disable_robot (const tripoint &p)
 If there is a robot (that can be disabled), query the player and try to disable it. More...
 
void draw_pixel_minimap (const catacurses::window &w)
 
void quicksave ()
 
void disp_NPCs ()
 
void list_missions ()
 
event_busevents ()
 
stats_trackerstats ()
 
memorial_loggermemorial ()
 
spell_eventsspell_events_subscriber ()
 
void display_toggle_overlay (action_id)
 
bool display_overlay_state (action_id)
 
void toggle_debug_hour_timer ()
 
tripoint mouse_edge_scrolling_terrain (input_context &ctxt)
 Used to implement mouse "edge scrolling". More...
 
tripoint mouse_edge_scrolling_overmap (input_context &ctxt)
 This variant is suitable for the overmap. More...
 
void shift_destination_preview (const point &delta)
 
bool slip_down ()
 Checks if player is able to successfully climb to/from some terrain and not slip down. More...
 
monsterplace_critter_at (const mtype_id &id, const tripoint &p)
 Adds critters to the reality bubble, creating them if necessary. More...
 
monsterplace_critter_at (const shared_ptr_fast< monster > &mon, const tripoint &p)
 
monsterplace_critter_around (const mtype_id &id, const tripoint &center, int radius)
 
monsterplace_critter_around (const shared_ptr_fast< monster > &mon, const tripoint &center, int radius, bool forced=false)
 
monsterplace_critter_within (const mtype_id &id, const tripoint_range< tripoint > &range)
 
monsterplace_critter_within (const shared_ptr_fast< monster > &mon, const tripoint_range< tripoint > &range)
 

Public Attributes

mapm
 
avataru
 
scent_mapscent
 
timed_event_managertimed_events
 
pimpl< Creature_trackercritter_tracker
 
pimpl< faction_managerfaction_manager_ptr
 
pimpl< drop_token_providertoken_provider_ptr
 
quit_status uquit
 Used in main.cpp to determine what type of quit is being performed. More...
 
bool new_game = false
 True if the game has just started or loaded, else false. More...
 
const scenarioscen
 
std::vector< monstercoming_to_stairs
 
int monstairz = 0
 
tripoint ter_view_p
 
catacurses::window w_terrain
 
catacurses::window w_overmap
 
catacurses::window w_omlegend
 
catacurses::window w_minimap
 
catacurses::window w_pixel_minimap
 
point driving_view_offset
 
bool debug_pathfinding = false
 
bool debug_submap_grid_overlay = false
 
Creaturedisplaying_visibility_creature
 Creature for which to display the visibility map. More...
 
int displaying_lighting_condition = 0
 Type of lighting condition overlay to display. More...
 
bool show_panel_adm = false
 
bool right_sidebar = false
 
bool fullscreen = false
 
bool was_fullscreen = false
 
bool auto_travel_mode = false
 
bool queue_screenshot = false
 
safe_mode_type safe_mode
 
int turnssincelastmon = 0
 
int mostseen = 0
 

Private Types

enum class  vmenu_ret : int { CHANGE_TAB , QUIT , FIRE }
 

Private Member Functions

void unload_npcs ()
 Unloads all NPCs. More...
 
bool load (const save_t &name)
 
void load_master ()
 
bool start_game ()
 
bool save_factions_missions_npcs ()
 
void reset_npc_dispositions ()
 
void serialize_master (std::ostream &fout)
 
bool save_artifacts ()
 
bool save_maps ()
 
void init_autosave ()
 
void create_starting_npcs ()
 
vehicleplace_vehicle_nearby (const vproto_id &id, const point_abs_omt &origin, int min_distance, int max_distance, const std::vector< std::string > &omt_search_types={})
 
void list_items_monsters ()
 
game::vmenu_ret list_items (const std::vector< map_item_stack > &item_list)
 
std::vector< map_item_stackfind_nearby_items (int iRadius)
 
void reset_item_list_state (const catacurses::window &window, int height, bool bRadiusSort)
 
game::vmenu_ret list_monsters (const std::vector< Creature * > &monster_list)
 
bool grabbed_move (const tripoint &dp)
 Check for dangerous stuff at dest_loc, return false if the player decides not to step there. More...
 
bool grabbed_veh_move (const tripoint &dp)
 
bool grabbed_furn_move (const tripoint &dp)
 
void control_vehicle ()
 
void examine (const tripoint &p)
 
void examine ()
 
void pickup ()
 
void pickup (const tripoint &p)
 
void pickup_feet ()
 
void drop ()
 
void drop_in_direction ()
 
void butcher ()
 
void chat ()
 
void print_fields_info (const tripoint &lp, const catacurses::window &w_look, int column, int &line)
 
void print_terrain_info (const tripoint &lp, const catacurses::window &w_look, const std::string &area_name, int column, int &line)
 
void print_trap_info (const tripoint &lp, const catacurses::window &w_look, int column, int &line)
 
void print_creature_info (const Creature *creature, const catacurses::window &w_look, int column, int &line, int last_line)
 
void print_vehicle_info (const vehicle *veh, int veh_part, const catacurses::window &w_look, int column, int &line, int last_line)
 
void print_visibility_info (const catacurses::window &w_look, int column, int &line, visibility_type visibility)
 
void print_items_info (const tripoint &lp, const catacurses::window &w_look, int column, int &line, int last_line)
 
void print_graffiti_info (const tripoint &lp, const catacurses::window &w_look, int column, int &line, int last_line)
 
input_context get_player_input (std::string &action)
 
void replace_stair_monsters ()
 
void update_stair_monsters ()
 
void shift_monsters (const tripoint &shift)
 Shift all active monsters, the shift vector is the number of shifted submaps. More...
 
void perhaps_add_random_npc ()
 
void monmove ()
 
void overmap_npc_move ()
 
void process_voluntary_act_interrupt ()
 
void process_activity ()
 
void handle_key_blocking_activity ()
 
void open_consume_item_menu ()
 
bool handle_action ()
 
bool try_get_right_click_action (action_id &act, const tripoint &mouse_target)
 
bool try_get_left_click_action (action_id &act, const tripoint &mouse_target)
 
void item_action_menu ()
 
bool is_game_over ()
 
void death_screen ()
 
void win_screen ()
 
void draw_minimap ()
 
void autosave ()
 
void quickload ()
 
bool handle_mouseview (input_context &ctxt, std::string &action)
 
void display_faction_epilogues ()
 
void disp_NPC_epilogues ()
 
void display_scent ()
 
void display_temperature ()
 
void display_vehicle_ai ()
 
void display_visibility ()
 
void display_lighting ()
 
void display_radiation ()
 
void display_transparency ()
 
Creatureis_hostile_within (int distance)
 
void move_save_to_graveyard (const std::string &dirname)
 
bool save_player_data ()
 
std::pair< tripoint, tripointmouse_edge_scrolling (input_context &ctxt, int speed, const tripoint &last, bool iso)
 

Private Attributes

bool is_looking = false
 
std::vector< weak_ptr_fast< draw_callback_t > > draw_callbacks
 
cata::optional< action_iddisplaying_overlays
 
class game::debug_hour_timer debug_hour_timer
 
pimpl< mapmap_ptr
 
pimpl< avataru_ptr
 
pimpl< live_viewliveview_ptr
 
live_viewliveview
 
pimpl< scent_mapscent_ptr
 
pimpl< timed_event_managertimed_event_manager_ptr
 
pimpl< event_busevent_bus_ptr
 
pimpl< stats_trackerstats_tracker_ptr
 
pimpl< achievements_trackerachievements_tracker_ptr
 
pimpl< kill_trackerkill_tracker_ptr
 
pimpl< memorial_loggermemorial_logger_ptr
 
pimpl< spell_eventsspell_events_ptr
 
pimpl< distribution_grid_trackergrid_tracker_ptr
 
pimpl< weather_managerweather_manager_ptr
 
shared_ptr_fast< playeru_shared_ptr
 
catacurses::window w_terrain_ptr
 
catacurses::window w_minimap_ptr
 
std::string sFilter
 
std::string list_item_upvote
 
std::string list_item_downvote
 
bool safe_mode_warning_logged = false
 
bool bVMonsterLookFire = false
 
character_id next_npc_id
 
std::list< shared_ptr_fast< npc > > active_npc
 
int next_mission_id = 0
 
std::set< character_idfollower_ids
 
int moves_since_last_save = 0
 
time_t last_save_timestamp
 
std::array< float, OVERMAP_LAYERSlatest_lightlevels
 
time_point remoteveh_cache_time
 
vehicleremoteveh_cache
 
bool npcs_dirty = false
 Has a NPC been spawned since last load? More...
 
bool critter_died = false
 Has anything died in this turn and needs to be cleaned up? More...
 
bool first_redraw_since_waiting_started = true
 Is this the first redraw since waiting (sleeping or activity) started. More...
 
bool zones_manager_open = false
 Is Zone manager open or not - changes graphics of some zone tiles. More...
 
std::unique_ptr< special_gamegamemode
 
int user_action_counter = 0
 
int tileset_zoom = 0
 How far the tileset should be zoomed out, 16 is default. More...
 
unsigned int seed = 0
 Seed for all the random numbers that should have consistent randomness (weather). More...
 
std::vector< tripointdestination_preview
 
std::chrono::time_point< std::chrono::steady_clock > last_mouse_edge_scroll
 
tripoint last_mouse_edge_scroll_vector_terrain
 
tripoint last_mouse_edge_scroll_vector_overmap
 
weak_ptr_fast< ui_adaptormain_ui_adaptor
 
std::unique_ptr< static_popupwait_popup
 

Friends

class editmap
 
class advanced_inventory
 
class main_menu
 
class monster_range
 
class Creature_range
 
distribution_grid_trackerget_distribution_grid_tracker ()
 Returns distribution grid tracker that is a part of the global game *g. More...
 
mapget_map ()
 
Characterget_player_character ()
 
avatarget_avatar ()
 
weather_managerget_weather ()
 

Detailed Description

Definition at line 143 of file game.h.

Member Enumeration Documentation

◆ vmenu_ret

enum class game::vmenu_ret : int
strongprivate
Enumerator
CHANGE_TAB 
QUIT 
FIRE 

Definition at line 769 of file game.h.

769 : int {
770 CHANGE_TAB,
771 QUIT,
772 FIRE, // Who knew, apparently you can do that in list_monsters
773 };

Constructor & Destructor Documentation

◆ game()

game::game ( )

Definition at line 294 of file game.cpp.

294 :
296 scent_ptr( *this ),
299 m( *map_ptr ),
300 u( *u_ptr ),
301 scent( *scent_ptr ),
303 uquit( QUIT_NO ),
304 new_game( false ),
306 mostseen( 0 ),
309 next_npc_id( 1 ),
310 next_mission_id( 1 ),
314 seed( 0 ),
315 last_mouse_edge_scroll( std::chrono::steady_clock::now() )
316{
324 world_generator = std::make_unique<worldfactory>();
325 // do nothing, everything that was in here is moved to init_data() which is called immediately after g = new game; in main.cpp
326 // The reason for this move is so that g is not uninitialized when it gets to installing the parts into vehicles.
327}
void subscribe(event_subscriber *)
Definition: event_bus.cpp:39
int mostseen
Definition: game.h:1023
pimpl< spell_events > spell_events_ptr
Definition: game.h:958
safe_mode_type safe_mode
Definition: game.h:1020
bool safe_mode_warning_logged
Definition: game.h:1034
pimpl< timed_event_manager > timed_event_manager_ptr
Definition: game.h:952
std::chrono::time_point< std::chrono::steady_clock > last_mouse_edge_scroll
Definition: game.h:1068
quit_status uquit
Used in main.cpp to determine what type of quit is being performed.
Definition: game.h:978
event_bus & events()
Definition: game.cpp:2699
pimpl< stats_tracker > stats_tracker_ptr
Definition: game.h:954
character_id next_npc_id
Definition: game.h:1036
pimpl< kill_tracker > kill_tracker_ptr
Definition: game.h:956
void reset_light_level()
Definition: game.cpp:3543
pimpl< memorial_logger > memorial_logger_ptr
Definition: game.h:957
shared_ptr_fast< player > u_shared_ptr
Definition: game.h:1025
pimpl< map > map_ptr
Definition: game.h:947
bool first_redraw_since_waiting_started
Is this the first redraw since waiting (sleeping or activity) started.
Definition: game.h:1051
pimpl< live_view > liveview_ptr
Definition: game.h:949
pimpl< achievements_tracker > achievements_tracker_ptr
Definition: game.h:955
pimpl< scent_map > scent_ptr
Definition: game.h:951
timed_event_manager & timed_events
Definition: game.h:966
unsigned int seed
Seed for all the random numbers that should have consistent randomness (weather).
Definition: game.h:1063
int next_mission_id
Definition: game.h:1038
bool new_game
True if the game has just started or loaded, else false.
Definition: game.h:980
pimpl< distribution_grid_tracker > grid_tracker_ptr
Definition: game.h:959
map & m
Definition: game.h:963
avatar & u
Definition: game.h:964
scent_map & scent
Definition: game.h:965
int user_action_counter
Definition: game.h:1057
live_view & liveview
Definition: game.h:950
int tileset_zoom
How far the tileset should be zoomed out, 16 is default.
Definition: game.h:1060
pimpl< avatar > u_ptr
Definition: game.h:948
time_point remoteveh_cache_time
Definition: game.h:1044
static void achievement_attained(const achievement *a)
Definition: game.cpp:287
static constexpr int DEFAULT_TILESET_ZOOM
Definition: game.h:41
@ SAFE_MODE_ON
Definition: game.h:78
@ QUIT_NO
Definition: game.h:68
mapbuffer MAPBUFFER
Definition: mapbuffer.cpp:40
const time_point before_time_starts
A time point that is always before the current turn, even when the game has just started.
Definition: calendar.cpp:25
For use with smart pointers when you don't actually want the deleter to do anything.
Definition: cata_utility.h:28
std::unique_ptr< worldfactory > world_generator

References achievements_tracker_ptr, events(), first_redraw_since_waiting_started, kill_tracker_ptr, memorial_logger_ptr, reset_light_level(), spell_events_ptr, stats_tracker_ptr, event_bus::subscribe(), and world_generator.

◆ ~game()

game::~game ( )
default

Member Function Documentation

◆ add_artifact_dreams()

void game::add_artifact_dreams ( )

Definition at line 11778 of file game.cpp.

11779{
11780 //If player is sleeping, get a dream from a carried artifact
11781 //Don't need to check that player is sleeping here, that's done before calling
11782 std::vector<item *> art_items = u.items_with( []( const item & it ) -> bool {
11783 return it.is_artifact();
11784 } );
11785 std::vector<item *> valid_arts;
11786 std::vector<std::vector<std::string>>
11787 valid_dreams; // Tracking separately so we only need to check its req once
11788 //Pull the list of dreams
11789 add_msg( m_debug, "Checking %s carried artifacts", art_items.size() );
11790 for( auto &it : art_items ) {
11791 //Pick only the ones with an applicable dream
11793 if( art && art->charge_req != ACR_NULL &&
11794 ( it->ammo_remaining() < it->ammo_capacity() ||
11795 it->ammo_capacity() == 0 ) ) { //or max 0 in case of wacky mod shenanigans
11796 add_msg( m_debug, "Checking artifact %s", it->tname() );
11797 if( check_art_charge_req( *it ) ) {
11798 add_msg( m_debug, " Has freq %s,%s", art->dream_freq_met, art->dream_freq_unmet );
11799 if( art->dream_freq_met > 0 && x_in_y( art->dream_freq_met, 100 ) ) {
11800 add_msg( m_debug, "Adding met dream from %s", it->tname() );
11801 valid_arts.push_back( it );
11802 valid_dreams.push_back( art->dream_msg_met );
11803 }
11804 } else {
11805 add_msg( m_debug, " Has freq %s,%s", art->dream_freq_met, art->dream_freq_unmet );
11806 if( art->dream_freq_unmet > 0 && x_in_y( art->dream_freq_unmet, 100 ) ) {
11807 add_msg( m_debug, "Adding unmet dream from %s", it->tname() );
11808 valid_arts.push_back( it );
11809 valid_dreams.push_back( art->dream_msg_unmet );
11810 }
11811 }
11812 }
11813 }
11814 if( !valid_dreams.empty() ) {
11815 add_msg( m_debug, "Found %s valid artifact dreams", valid_dreams.size() );
11816 const int selected = rng( 0, valid_arts.size() - 1 );
11817 auto it = valid_arts[selected];
11818 auto msg = random_entry( valid_dreams[selected] );
11819 const std::string &dream = string_format( _( msg ), it->tname() );
11820 add_msg( dream );
11821 } else {
11822 add_msg( m_debug, "Didn't have any dreams, sorry" );
11823 }
11824}
units::quantity< V, B > rng(const units::quantity< V, B > &min, const units::quantity< V, B > &max)
Definition: artifact.cpp:32
@ ACR_NULL
Definition: artifact.h:79
bool x_in_y(const time_duration &a, const time_duration &b)
Definition: calendar.cpp:521
This class is essentially a copyable unique pointer.
Definition: value_ptr.h:19
Definition: item.h:177
int ammo_remaining() const
Quantity of ammunition currently loaded in tool, gun or auxiliary gunmod.
Definition: item.cpp:7261
bool is_artifact() const
Definition: item.cpp:6848
int ammo_capacity() const
Maximum quantity of ammunition loadable for tool, gun or auxiliary gunmod.
Definition: item.cpp:7288
std::string tname(unsigned int quantity=1, bool with_prefix=true, unsigned int truncate=0) const
Return the (translated) item name.
Definition: item.cpp:4478
const itype * type
Definition: item.h:2157
std::vector< item * > items_with(const std::function< bool(const item &)> &filter)
Returns all items (including those within a container) matching the filter.
Definition: visitable.cpp:324
@ m_debug
Definition: enums.h:271
bool check_art_charge_req(item &it)
Definition: game.cpp:11481
void add_msg(std::string msg)
Definition: messages.cpp:884
V random_entry(const C &container, D default_value)
Returns a random entry in the container.
Definition: rng.h:88
std::string string_format(std::string_view format, Args &&...args)
Simple wrapper over string_formatter::parse.
cata::value_ptr< islot_artifact > artifact
Definition: itype.h:866
#define _(msg)
Definition: translations.h:116

References _, ACR_NULL, add_msg(), item::ammo_capacity(), item::ammo_remaining(), itype::artifact, check_art_charge_req(), item::is_artifact(), visitable< T >::items_with(), m_debug, random_entry(), rng(), string_format(), item::tname(), item::type, u, and x_in_y().

Referenced by do_turn().

◆ add_artifact_messages()

void game::add_artifact_messages ( const std::vector< art_effect_passive > &  effects)

Definition at line 11600 of file game.cpp.

11601{
11602 int net_str = 0;
11603 int net_dex = 0;
11604 int net_per = 0;
11605 int net_int = 0;
11606 int net_speed = 0;
11607
11608 for( auto &i : effects ) {
11609 switch( i ) {
11610 case AEP_STR_UP:
11611 net_str += 4;
11612 break;
11613 case AEP_DEX_UP:
11614 net_dex += 4;
11615 break;
11616 case AEP_PER_UP:
11617 net_per += 4;
11618 break;
11619 case AEP_INT_UP:
11620 net_int += 4;
11621 break;
11622 case AEP_ALL_UP:
11623 net_str += 2;
11624 net_dex += 2;
11625 net_per += 2;
11626 net_int += 2;
11627 break;
11628 case AEP_STR_DOWN:
11629 net_str -= 3;
11630 break;
11631 case AEP_DEX_DOWN:
11632 net_dex -= 3;
11633 break;
11634 case AEP_PER_DOWN:
11635 net_per -= 3;
11636 break;
11637 case AEP_INT_DOWN:
11638 net_int -= 3;
11639 break;
11640 case AEP_ALL_DOWN:
11641 net_str -= 2;
11642 net_dex -= 2;
11643 net_per -= 2;
11644 net_int -= 2;
11645 break;
11646
11647 case AEP_SPEED_UP:
11648 net_speed += 20;
11649 break;
11650 case AEP_SPEED_DOWN:
11651 net_speed -= 20;
11652 break;
11653
11654 case AEP_PBLUE:
11655 break; // No message
11656
11657 case AEP_SNAKES:
11658 add_msg( m_warning, _( "Your skin feels slithery." ) );
11659 break;
11660
11661 case AEP_INVISIBLE:
11662 add_msg( m_good, _( "You fade into invisibility!" ) );
11663 break;
11664
11665 case AEP_CLAIRVOYANCE:
11667 add_msg( m_good, _( "You can see through walls!" ) );
11668 break;
11669
11671 add_msg( m_good, _( "You can see through everything!" ) );
11672 break;
11673
11674 case AEP_STEALTH:
11675 add_msg( m_good, _( "Your steps stop making noise." ) );
11676 break;
11677
11678 case AEP_GLOW:
11679 add_msg( _( "A glow of light forms around you." ) );
11680 break;
11681
11682 case AEP_PSYSHIELD:
11683 add_msg( m_good, _( "Your mental state feels protected." ) );
11684 break;
11685
11687 add_msg( m_good, _( "You feel insulated." ) );
11688 break;
11689
11690 case AEP_CARRY_MORE:
11691 add_msg( m_good, _( "Your back feels strengthened." ) );
11692 break;
11693
11694 case AEP_FUN:
11695 add_msg( m_good, _( "You feel a pleasant tingle." ) );
11696 break;
11697
11698 case AEP_HUNGER:
11699 add_msg( m_warning, _( "You feel hungry." ) );
11700 break;
11701
11702 case AEP_THIRST:
11703 add_msg( m_warning, _( "You feel thirsty." ) );
11704 break;
11705
11706 case AEP_EVIL:
11707 add_msg( m_warning, _( "You feel an evil presence…" ) );
11708 break;
11709
11710 case AEP_SCHIZO:
11711 add_msg( m_bad, _( "You feel a tickle of insanity." ) );
11712 break;
11713
11714 case AEP_RADIOACTIVE:
11715 add_msg( m_warning, _( "Your skin prickles with radiation." ) );
11716 break;
11717
11718 case AEP_MUTAGENIC:
11719 add_msg( m_bad, _( "You feel your genetic makeup degrading." ) );
11720 break;
11721
11722 case AEP_ATTENTION:
11723 add_msg( m_warning, _( "You feel an otherworldly attention upon you…" ) );
11724 break;
11725
11726 case AEP_FORCE_TELEPORT:
11727 add_msg( m_bad, _( "You feel a force pulling you inwards." ) );
11728 break;
11729
11730 case AEP_MOVEMENT_NOISE:
11731 add_msg( m_warning, _( "You hear a rattling noise coming from inside yourself." ) );
11732 break;
11733
11734 case AEP_BAD_WEATHER:
11735 add_msg( m_warning, _( "You feel storms coming." ) );
11736 break;
11737
11738 case AEP_SICK:
11739 add_msg( m_bad, _( "You feel unwell." ) );
11740 break;
11741
11742 case AEP_SMOKE:
11743 add_msg( m_warning, _( "A cloud of smoke appears." ) );
11744 break;
11745 default:
11746 //Suppress warnings
11747 break;
11748 }
11749 }
11750
11751 std::string stat_info;
11752 if( net_str != 0 ) {
11753 stat_info += string_format( _( "Str %s%d! " ),
11754 ( net_str > 0 ? "+" : "" ), net_str );
11755 }
11756 if( net_dex != 0 ) {
11757 stat_info += string_format( _( "Dex %s%d! " ),
11758 ( net_dex > 0 ? "+" : "" ), net_dex );
11759 }
11760 if( net_int != 0 ) {
11761 stat_info += string_format( _( "Int %s%d! " ),
11762 ( net_int > 0 ? "+" : "" ), net_int );
11763 }
11764 if( net_per != 0 ) {
11765 stat_info += string_format( _( "Per %s%d! " ),
11766 ( net_per > 0 ? "+" : "" ), net_per );
11767 }
11768
11769 if( !stat_info.empty() ) {
11770 add_msg( m_neutral, stat_info );
11771 }
11772
11773 if( net_speed != 0 ) {
11774 add_msg( m_info, _( "Speed %s%d!" ), ( net_speed > 0 ? "+" : "" ), net_speed );
11775 }
11776}
@ m_good
Definition: enums.h:260
@ m_neutral
Definition: enums.h:267
@ m_info
Definition: enums.h:265
@ m_bad
Definition: enums.h:261
@ m_warning
Definition: enums.h:264
@ AEP_GLOW
Definition: enums.h:115
@ AEP_MUTAGENIC
Definition: enums.h:130
@ AEP_ALL_UP
Definition: enums.h:106
@ AEP_INT_UP
Definition: enums.h:105
@ AEP_INT_DOWN
Definition: enums.h:135
@ AEP_PER_UP
Definition: enums.h:104
@ AEP_PSYSHIELD
Definition: enums.h:116
@ AEP_CLAIRVOYANCE_PLUS
Definition: enums.h:142
@ AEP_MOVEMENT_NOISE
Definition: enums.h:139
@ AEP_STEALTH
Definition: enums.h:113
@ AEP_CARRY_MORE
Definition: enums.h:118
@ AEP_THIRST
Definition: enums.h:125
@ AEP_SPEED_UP
Definition: enums.h:107
@ AEP_EVIL
Definition: enums.h:127
@ AEP_ALL_DOWN
Definition: enums.h:136
@ AEP_DEX_UP
Definition: enums.h:103
@ AEP_SCHIZO
Definition: enums.h:128
@ AEP_DEX_DOWN
Definition: enums.h:133
@ AEP_FUN
Definition: enums.h:120
@ AEP_PER_DOWN
Definition: enums.h:134
@ AEP_FORCE_TELEPORT
Definition: enums.h:138
@ AEP_ATTENTION
Definition: enums.h:131
@ AEP_RADIOACTIVE
Definition: enums.h:129
@ AEP_SUPER_CLAIRVOYANCE
Definition: enums.h:112
@ AEP_BAD_WEATHER
Definition: enums.h:140
@ AEP_SICK
Definition: enums.h:141
@ AEP_CLAIRVOYANCE
Definition: enums.h:111
@ AEP_INVISIBLE
Definition: enums.h:110
@ AEP_STR_UP
Definition: enums.h:102
@ AEP_STR_DOWN
Definition: enums.h:132
@ AEP_HUNGER
Definition: enums.h:124
@ AEP_RESIST_ELECTRICITY
Definition: enums.h:117
@ AEP_PBLUE
Definition: enums.h:108
@ AEP_SPEED_DOWN
Definition: enums.h:137
@ AEP_SNAKES
Definition: enums.h:109
@ AEP_SMOKE
Definition: enums.h:126

References _, add_msg(), AEP_ALL_DOWN, AEP_ALL_UP, AEP_ATTENTION, AEP_BAD_WEATHER, AEP_CARRY_MORE, AEP_CLAIRVOYANCE, AEP_CLAIRVOYANCE_PLUS, AEP_DEX_DOWN, AEP_DEX_UP, AEP_EVIL, AEP_FORCE_TELEPORT, AEP_FUN, AEP_GLOW, AEP_HUNGER, AEP_INT_DOWN, AEP_INT_UP, AEP_INVISIBLE, AEP_MOVEMENT_NOISE, AEP_MUTAGENIC, AEP_PBLUE, AEP_PER_DOWN, AEP_PER_UP, AEP_PSYSHIELD, AEP_RADIOACTIVE, AEP_RESIST_ELECTRICITY, AEP_SCHIZO, AEP_SICK, AEP_SMOKE, AEP_SNAKES, AEP_SPEED_DOWN, AEP_SPEED_UP, AEP_STEALTH, AEP_STR_DOWN, AEP_STR_UP, AEP_SUPER_CLAIRVOYANCE, AEP_THIRST, m_bad, m_good, m_info, m_neutral, m_warning, and string_format().

◆ add_draw_callback()

void game::add_draw_callback ( shared_ptr_fast< draw_callback_t cb)

Definition at line 2994 of file game.cpp.

2995{
2996 draw_callbacks.erase(
2997 std::remove_if( draw_callbacks.begin(), draw_callbacks.end(),
2998 []( const weak_ptr_fast<draw_callback_t> &cbw ) {
2999 return cbw.expired();
3000 } ),
3001 draw_callbacks.end()
3002 );
3003 draw_callbacks.emplace_back( cb );
3004 cb->added = true;
3006}
void invalidate_main_ui_adaptor() const
Definition: game.cpp:2959
std::vector< weak_ptr_fast< draw_callback_t > > draw_callbacks
Definition: game.h:225
std::weak_ptr< T > weak_ptr_fast
Definition: memory_fast.h:17

References draw_callbacks, and invalidate_main_ui_adaptor().

Referenced by get_player_input(), list_items(), list_monsters(), look_around(), pickup(), and zones_manager().

◆ add_npc_follower()

void game::add_npc_follower ( const character_id id)

Add follower id to set of followers.

Definition at line 1871 of file game.cpp.

1872{
1873 follower_ids.insert( id );
1874 u.follower_ids.insert( id );
1875}
std::set< character_id > follower_ids
Definition: game.h:1039
std::set< character_id > follower_ids
Definition: player.h:491

References follower_ids, player::follower_ids, and u.

Referenced by validate_npc_followers().

◆ all_creatures()

game::Creature_range game::all_creatures ( )

Returns an anonymous range that contains all creatures.

The range allows iteration via a range-based for loop, e.g. for( Creature &critter : all_creatures() ) { ... }. One shall not store the returned range nor the iterators. One can freely remove and add creatures to the game during the iteration. Added creatures will not be iterated over.

Definition at line 11936 of file game.cpp.

11937{
11938 return Creature_range( *this );
11939}
friend class Creature_range
Definition: game.h:334

References Creature_range.

Referenced by draw_ter(), get_creature_if(), and get_creatures_if().

◆ all_monsters()

game::monster_range game::all_monsters ( )

Same as all_creatures but iterators only over monsters.

Definition at line 11941 of file game.cpp.

11942{
11943 return monster_range( *this );
11944}
friend class monster_range
Definition: game.h:333

References monster_range.

Referenced by cleanup_at_end(), disp_NPCs(), get_fishable_monsters(), monmove(), place_player_overmap(), shift_monsters(), start_game(), validate_mounted_npcs(), and vertical_move().

◆ all_npcs()

game::npc_range game::all_npcs ( )

Same as all_creatures but iterators only over npcs.

Definition at line 11946 of file game.cpp.

11947{
11948 return npc_range( *this );
11949}

Referenced by do_turn(), and get_npcs_if().

◆ allies()

std::vector< npc * > game::allies ( )

Get all living player allies.

Definition at line 11850 of file game.cpp.

11851{
11852 return get_npcs_if( [&]( const npc & guy ) {
11853 if( !guy.is_hallucination() ) {
11854 return guy.is_ally( g->u );
11855 } else {
11856 return false;
11857 }
11858 } );
11859}
std::vector< npc * > get_npcs_if(const std::function< bool(const npc &)> &pred)
Definition: game.cpp:11873
Definition: npc.h:781
bool is_hallucination() const override
Definition: npc.cpp:3260

References get_npcs_if(), and npc::is_hallucination().

◆ assign_mission_id()

int game::assign_mission_id ( )

Returns the next available mission id.

Definition at line 1859 of file game.cpp.

1860{
1861 int ret = next_mission_id;
1863 return ret;
1864}

References next_mission_id, and cata::hash64_detail::ret.

◆ assign_npc_id()

character_id game::assign_npc_id ( )

Definition at line 3551 of file game.cpp.

3552{
3554 ++next_npc_id;
3555 return ret;
3556}

References next_npc_id, and cata::hash64_detail::ret.

Referenced by load(), and start_game().

◆ autopilot_vehicles()

void game::autopilot_vehicles ( )

process vehicles that are following the player

Definition at line 1658 of file game.cpp.

1659{
1660 for( wrapped_vehicle &veh : m.get_vehicles() ) {
1661 vehicle *&v = veh.v;
1662 if( v->is_following ) {
1663 v->drive_to_local_target( m.getabs( u.pos() ), true );
1664 } else if( v->is_patrolling ) {
1665 v->autopilot_patrol();
1666 }
1667 }
1668}
const tripoint & pos() const override
Definition: character.cpp:721
tripoint getabs(const tripoint &p) const
Translates local (to this map) coordinates of a square to global absolute coordinates.
Definition: map.cpp:8275
VehicleList get_vehicles()
Definition: map.cpp:237
A vehicle as a whole with all its components.
Definition: vehicle.h:675
void autopilot_patrol()
Definition: vehicle.cpp:701
bool is_following
Definition: vehicle.h:1983
bool is_patrolling
Definition: vehicle.h:1984
void drive_to_local_target(const tripoint &target, bool follow_protocol)
Definition: vehicle.cpp:816

References vehicle::autopilot_patrol(), vehicle::drive_to_local_target(), map::get_vehicles(), map::getabs(), vehicle::is_following, vehicle::is_patrolling, m, Character::pos(), and u.

Referenced by do_turn().

◆ autosave()

void game::autosave ( )
private

Definition at line 11267 of file game.cpp.

11268{
11269 //Don't autosave if the min-autosave interval has not passed since the last autosave/quicksave.
11270 if( time( nullptr ) < last_save_timestamp + 60 * get_option<int>( "AUTOSAVE_MINUTES" ) ) {
11271 return;
11272 }
11273 quicksave(); //Driving checks are handled by quicksave()
11274}
time_t last_save_timestamp
Definition: game.h:1041
void quicksave()
Definition: game.cpp:11222

References last_save_timestamp, and quicksave().

Referenced by do_turn().

◆ butcher()

void game::butcher ( )
private

Definition at line 8262 of file game.cpp.

8263{
8264 static const std::string salvage_string = "salvage";
8265 if( u.controlling_vehicle ) {
8266 add_msg( m_info, _( "You can't butcher while driving!" ) );
8267 return;
8268 }
8269
8270 const int factor = u.max_quality( quality_id( "BUTCHER" ) );
8271 const int factorD = u.max_quality( quality_id( "CUT_FINE" ) );
8272 const std::string no_knife_msg = _( "You don't have a butchering tool." );
8273 const std::string no_corpse_msg = _( "There are no corpses here to butcher." );
8274
8275 //You can't butcher on sealed terrain- you have to smash/shovel/etc it open first
8276 if( m.has_flag( "SEALED", u.pos() ) ) {
8277 if( m.sees_some_items( u.pos(), u ) ) {
8278 add_msg( m_info, _( "You can't access the items here." ) );
8279 } else if( factor > INT_MIN || factorD > INT_MIN ) {
8280 add_msg( m_info, no_corpse_msg );
8281 } else {
8282 add_msg( m_info, no_knife_msg );
8283 }
8284 return;
8285 }
8286
8287 const item *first_item_without_tools = nullptr;
8288 // Indices of relevant items
8289 std::vector<map_stack::iterator> corpses;
8290 std::vector<map_stack::iterator> disassembles;
8291 std::vector<map_stack::iterator> salvageables;
8292 map_stack items = m.i_at( u.pos() );
8293 const inventory &crafting_inv = u.crafting_inventory();
8294
8295 // TODO: Properly handle different material whitelists
8296 // TODO: Improve quality of this section
8297 auto salvage_filter = []( item it ) {
8298 const auto usable = it.get_usable_item( salvage_string );
8299 return usable != nullptr;
8300 };
8301
8302 std::vector< item * > salvage_tools = u.items_with( salvage_filter );
8303 int salvage_tool_index = INT_MIN;
8304 item *salvage_tool = nullptr;
8305 const salvage_actor *salvage_iuse = nullptr;
8306 if( !salvage_tools.empty() ) {
8307 salvage_tool = salvage_tools.front();
8308 salvage_tool_index = u.get_item_position( salvage_tool );
8309 item *usable = salvage_tool->get_usable_item( salvage_string );
8310 salvage_iuse = dynamic_cast<const salvage_actor *>(
8311 usable->get_use( salvage_string )->get_actor_ptr() );
8312 }
8313
8314 // Reserve capacity for each to hold entire item set if necessary to prevent
8315 // reallocations later on
8316 corpses.reserve( items.size() );
8317 salvageables.reserve( items.size() );
8318 disassembles.reserve( items.size() );
8319
8320 // Split into corpses, disassemble-able, and salvageable items
8321 // It's not much additional work to just generate a corpse list and
8322 // clear it later, but does make the splitting process nicer.
8323 for( map_stack::iterator it = items.begin(); it != items.end(); ++it ) {
8324 if( it->is_corpse() ) {
8325 corpses.push_back( it );
8326 } else {
8327 if( ( salvage_tool_index != INT_MIN ) && salvage_iuse->valid_to_cut_up( *it ) ) {
8328 salvageables.push_back( it );
8329 }
8330 if( crafting::can_disassemble( u, *it, crafting_inv ).success() ) {
8331 disassembles.push_back( it );
8332 } else if( !first_item_without_tools ) {
8333 first_item_without_tools = &*it;
8334 }
8335 }
8336 }
8337
8338 // Clear corpses if butcher and dissect factors are INT_MIN
8339 if( factor == INT_MIN && factorD == INT_MIN ) {
8340 corpses.clear();
8341 }
8342
8343 if( corpses.empty() && disassembles.empty() && salvageables.empty() ) {
8344 if( factor > INT_MIN || factorD > INT_MIN ) {
8345 add_msg( m_info, no_corpse_msg );
8346 } else {
8347 add_msg( m_info, no_knife_msg );
8348 }
8349
8350 if( first_item_without_tools ) {
8351 add_msg( m_info, _( "You don't have the necessary tools to disassemble any items here." ) );
8352 // Just for the "You need x to disassemble y" messages
8353 const auto ret = crafting::can_disassemble( u, *first_item_without_tools, crafting_inv );
8354 if( !ret.success() ) {
8355 add_msg( m_info, "%s", ret.c_str() );
8356 }
8357 }
8358 return;
8359 }
8360
8361 Creature *hostile_critter = is_hostile_very_close();
8362 if( hostile_critter != nullptr ) {
8363 if( !query_yn( _( "You see %s nearby! Start butchering anyway?" ),
8364 hostile_critter->disp_name() ) ) {
8365 return;
8366 }
8367 }
8368
8369 // Magic indices for special butcher options
8370 enum : int {
8371 MULTISALVAGE = MAX_ITEM_IN_SQUARE + 1,
8372 MULTIBUTCHER,
8373 MULTIDISASSEMBLE_ONE,
8374 MULTIDISASSEMBLE_ALL,
8375 NUM_BUTCHER_ACTIONS
8376 };
8377 // What are we butchering (i.e.. which vector to pick indices from)
8378 enum {
8379 BUTCHER_CORPSE,
8380 BUTCHER_DISASSEMBLE,
8381 BUTCHER_SALVAGE,
8382 BUTCHER_OTHER // For multisalvage etc.
8383 } butcher_select = BUTCHER_CORPSE;
8384 // Index to std::vector of iterators...
8385 int indexer_index = 0;
8386
8387 // Generate the indexed stacks so we can display them nicely
8388 const auto disassembly_stacks = generate_butcher_stack_display( disassembles );
8389 const auto salvage_stacks = generate_butcher_stack_display( salvageables );
8390 // Always ask before cutting up/disassembly, but not before butchery
8391 size_t ret = 0;
8392 if( !corpses.empty() || !disassembles.empty() || !salvageables.empty() ) {
8393 uilist kmenu;
8394 kmenu.text = _( "Choose corpse to butcher / item to disassemble" );
8395
8396 size_t i = 0;
8397 // Add corpses, disassembleables, and salvagables to the UI
8398 add_corpses( kmenu, corpses, i );
8399 add_disassemblables( kmenu, disassembly_stacks, i );
8400 if( salvage_iuse && !salvageables.empty() ) {
8401 add_salvagables( kmenu, salvage_stacks, i, *salvage_iuse );
8402 }
8403
8404 if( corpses.size() > 1 ) {
8405 kmenu.addentry( MULTIBUTCHER, true, 'b', _( "Butcher everything" ) );
8406 }
8407 if( disassembles.size() > 1 ) {
8408 int time_to_disassemble = 0;
8409 int time_to_disassemble_all = 0;
8410 for( const auto &stack : disassembly_stacks ) {
8411 const int time = recipe_dictionary::get_uncraft( stack.first->typeId() ).time;
8412 time_to_disassemble += time;
8413 time_to_disassemble_all += time * stack.second;
8414 }
8415
8416 kmenu.addentry_col( MULTIDISASSEMBLE_ONE, true, 'D', _( "Disassemble everything once" ),
8417 to_string_clipped( time_duration::from_turns( time_to_disassemble / 100 ) ) );
8418 kmenu.addentry_col( MULTIDISASSEMBLE_ALL, true, 'd', _( "Disassemble everything recursively" ),
8419 to_string_clipped( time_duration::from_turns( time_to_disassemble_all / 100 ) ) );
8420 }
8421 if( salvage_iuse && salvageables.size() > 1 ) {
8422 int time_to_salvage = 0;
8423 for( const auto &stack : salvage_stacks ) {
8424 time_to_salvage += salvage_iuse->time_to_cut_up( *stack.first ) * stack.second;
8425 }
8426
8427 kmenu.addentry_col( MULTISALVAGE, true, 'z', _( "Cut up everything" ),
8428 to_string_clipped( time_duration::from_turns( time_to_salvage / 100 ) ) );
8429 }
8430
8431 kmenu.query();
8432
8433 if( kmenu.ret < 0 || kmenu.ret >= NUM_BUTCHER_ACTIONS ) {
8434 return;
8435 }
8436
8437 ret = static_cast<size_t>( kmenu.ret );
8438 if( ret >= MULTISALVAGE && ret < NUM_BUTCHER_ACTIONS ) {
8439 butcher_select = BUTCHER_OTHER;
8440 indexer_index = ret;
8441 } else if( ret < corpses.size() ) {
8442 butcher_select = BUTCHER_CORPSE;
8443 indexer_index = ret;
8444 } else if( ret < corpses.size() + disassembly_stacks.size() ) {
8445 butcher_select = BUTCHER_DISASSEMBLE;
8446 indexer_index = ret - corpses.size();
8447 } else if( ret < corpses.size() + disassembly_stacks.size() + salvage_stacks.size() ) {
8448 butcher_select = BUTCHER_SALVAGE;
8449 indexer_index = ret - corpses.size() - disassembly_stacks.size();
8450 } else {
8451 debugmsg( "Invalid butchery index: %d", ret );
8452 return;
8453 }
8454 }
8455
8456 if( !u.has_morale_to_craft() ) {
8457 if( butcher_select == BUTCHER_CORPSE || indexer_index == MULTIBUTCHER ) {
8458 add_msg( m_info,
8459 _( "You are not in the mood and the prospect of guts and blood on your hands convinces you to turn away." ) );
8460 } else {
8461 add_msg( m_info,
8462 _( "You are not in the mood and the prospect of work stops you before you begin." ) );
8463 }
8464 return;
8465 }
8466 const auto helpers = u.get_crafting_helpers( 3 );
8467 for( const npc *np : helpers ) {
8468 add_msg( m_info, _( "%s helps with this task…" ), np->name );
8469 }
8470 switch( butcher_select ) {
8471 case BUTCHER_OTHER:
8472 switch( indexer_index ) {
8473 case MULTISALVAGE:
8474 u.assign_activity( activity_id( "ACT_LONGSALVAGE" ), 0, salvage_tool_index );
8475 break;
8476 case MULTIBUTCHER:
8477 butcher_submenu( corpses );
8478 for( map_stack::iterator &it : corpses ) {
8479 u.activity.targets.emplace_back( map_cursor( u.pos() ), &*it );
8480 }
8481 break;
8482 case MULTIDISASSEMBLE_ONE:
8483 crafting::disassemble_all( u, false );
8484 break;
8485 case MULTIDISASSEMBLE_ALL:
8487 break;
8488 default:
8489 debugmsg( "Invalid butchery type: %d", indexer_index );
8490 return;
8491 }
8492 break;
8493 case BUTCHER_CORPSE: {
8494 butcher_submenu( corpses, indexer_index );
8495 u.activity.targets.emplace_back( map_cursor( u.pos() ), &*corpses[indexer_index] );
8496 }
8497 break;
8498 case BUTCHER_DISASSEMBLE: {
8499 // Pick index of first item in the disassembly stack
8500 item *const target = &*disassembly_stacks[indexer_index].first;
8502 }
8503 break;
8504 case BUTCHER_SALVAGE: {
8505 if( !salvage_iuse || !salvage_tool ) {
8506 debugmsg( "null salve_iuse or salvage_tool" );
8507 } else {
8508 // Pick index of first item in the salvage stack
8509 item *const target = &*salvage_stacks[indexer_index].first;
8510 item_location item_loc( map_cursor( u.pos() ), target );
8511 salvage_iuse->cut_up( u, *salvage_tool, item_loc );
8512 }
8513 }
8514 break;
8515 }
8516}
string_id< activity_type > activity_id
Definition: activity_type.h:15
static std::string to_string_clipped(const int num, const clipped_unit type, const clipped_align align)
Definition: calendar.cpp:228
bool controlling_vehicle
Definition: character.h:255
player_activity activity
Definition: character.h:1548
int get_item_position(const item *it) const
Returns the item position (suitable for i_at or similar) of a specific item.
Definition: character.cpp:2459
bool has_morale_to_craft() const
Definition: crafting.cpp:335
const inventory & crafting_inventory(bool clear_path)
Definition: crafting.cpp:553
void assign_activity(const activity_id &type, int moves=calendar::INDEFINITELY_LONG, int index=-1, int pos=INT_MIN, const std::string &name="")
Legacy activity assignment, does not work for any activites using the new activity_actor class and ma...
Definition: character.cpp:9099
virtual std::string disp_name(bool possessive=false, bool capitalize_first=false) const =0
Creature * is_hostile_very_close()
Definition: game.cpp:3565
A lightweight handle to an item independent of it's location Unlike a raw pointer can be (de-)seriali...
Definition: item_location.h:23
size_t size() const
Definition: item_stack.cpp:10
iterator begin()
Definition: item_stack.cpp:28
iterator end()
Definition: item_stack.cpp:33
item * get_usable_item(const std::string &use_name)
Checks this item and its contents (recursively) for types that have use_function with type use_name.
Definition: item.cpp:7848
const use_function * get_use(const std::string &use_name) const
Returns the pointer to use_function with name use_name assigned to the type of this item or any of it...
Definition: item.cpp:7822
Definition: map.h:105
bool has_flag(const std::string &flag, const tripoint &p) const
Definition: map.cpp:2293
map_stack i_at(const tripoint &p)
Definition: map.cpp:4090
bool sees_some_items(const tripoint &p, const Creature &who) const
Check if creature can see some items at p.
Definition: map.cpp:4736
std::vector< item_location > targets
std::vector< npc * > get_crafting_helpers(size_t max=0) const
Returns nearby NPCs ready and willing to help with crafting or some other manual task.
Definition: crafting.cpp:2308
static const recipe & get_uncraft(const itype_id &id)
Returns disassembly recipe (or null recipe if no match)
int time
Definition: recipe.h:59
Cuts stuff up into components.
Definition: iuse_actor.h:567
bool valid_to_cut_up(const item &it) const
int cut_up(player &p, item &it, item_location &cut) const
int time_to_cut_up(const item &it) const
static constexpr time_duration from_turns(const T t)
Named constructors to get a duration representing a multiple of the named time units.
Definition: calendar.h:204
uilist: scrolling vertical list menu
Definition: ui.h:187
int ret
Definition: ui.h:412
void addentry_col(int r, bool e, int k, const std::string &str, const std::string &column, const std::string &desc="")
Definition: ui.cpp:962
std::string text
Definition: ui.h:320
void addentry(const std::string &str)
Definition: ui.cpp:942
int max_quality(const quality_id &qual) const
Return maximum tool quality level provided by instance or INT_MIN if not found.
Definition: visitable.cpp:276
#define debugmsg(...)
Debug message of level DL::Error and class DC::DebugMsg, also includes the source file name and line,...
Definition: debug.h:74
static void butcher_submenu(const std::vector< map_stack::iterator > &corpses, int corpse=-1)
Definition: game.cpp:8112
static void add_salvagables(uilist &menu, const std::vector< std::pair< map_stack::iterator, int > > &stacks, size_t &menu_index, const salvage_actor &salvage_iuse)
Definition: game.cpp:8070
static void add_disassemblables(uilist &menu, const std::vector< std::pair< map_stack::iterator, int > > &stacks, size_t &menu_index)
Definition: game.cpp:8091
static std::vector< std::pair< map_stack::iterator, int > > generate_butcher_stack_display(const std::vector< map_stack::iterator > &its)
Definition: game.cpp:8023
static void add_corpses(uilist &menu, const std::vector< map_stack::iterator > &its, size_t &menu_index)
Definition: game.cpp:8058
static constexpr int MAX_ITEM_IN_SQUARE
void query(bool loop=true, int timeout=-1)
Handle input and update display.
Definition: ui.cpp:838
ret_val< bool > can_disassemble(const Character &who, const item &obj, const inventory &inv)
Check if character can disassemble an item using the given crafting inventory.
Definition: crafting.cpp:1875
bool disassemble(avatar &you)
Prompt for an item to disassemble, then start activity.
Definition: crafting.cpp:2074
bool disassemble_all(avatar &you, bool recursively)
Start an activity to disassemble all items in avatar's square.
Definition: crafting.cpp:2085
bool query_yn(const std::string &text)
Definition: output.cpp:698
iuse_actor * get_actor_ptr()
Definition: iuse.h:314
string_id< quality > quality_id
Definition: type_id.h:181

References _, Character::activity, add_corpses(), add_disassemblables(), add_msg(), add_salvagables(), uilist::addentry(), uilist::addentry_col(), Character::assign_activity(), item_stack::begin(), butcher_submenu(), crafting::can_disassemble(), Character::controlling_vehicle, Character::crafting_inventory(), salvage_actor::cut_up(), debugmsg, crafting::disassemble(), crafting::disassemble_all(), Creature::disp_name(), item_stack::end(), time_duration::from_turns(), generate_butcher_stack_display(), use_function::get_actor_ptr(), player::get_crafting_helpers(), Character::get_item_position(), recipe_dictionary::get_uncraft(), item::get_usable_item(), item::get_use(), map::has_flag(), Character::has_morale_to_craft(), map::i_at(), is_hostile_very_close(), visitable< T >::items_with(), m, m_info, MAX_ITEM_IN_SQUARE, visitable< T >::max_quality(), Character::pos(), uilist::query(), query_yn(), cata::hash64_detail::ret, uilist::ret, map::sees_some_items(), item_stack::size(), player_activity::targets, uilist::text, recipe::time, salvage_actor::time_to_cut_up(), to_string_clipped(), u, and salvage_actor::valid_to_cut_up().

Referenced by handle_action().

◆ calc_driving_offset()

void game::calc_driving_offset ( vehicle veh = nullptr)

Definition at line 1238 of file game.cpp.

1239{
1240 if( veh == nullptr || !get_option<bool>( "DRIVING_VIEW_OFFSET" ) ) {
1242 return;
1243 }
1244 const int g_light_level = static_cast<int>( light_level( u.posz() ) );
1245 const int light_sight_range = u.sight_range( g_light_level );
1246 int sight = std::max( veh_lumi( *veh ), light_sight_range );
1247
1248 // The maximal offset will leave at least this many tiles
1249 // between the PC and the edge of the main window.
1250 static const int border_range = 2;
1251 point max_offset( ( getmaxx( w_terrain ) + 1 ) / 2 - border_range - 1,
1252 ( getmaxy( w_terrain ) + 1 ) / 2 - border_range - 1 );
1253
1254 // velocity at or below this results in no offset at all
1255 static const float min_offset_vel = 1 * vehicles::vmiph_per_tile;
1256 // velocity at or above this results in maximal offset
1257 static const float max_offset_vel = std::min( max_offset.y, max_offset.x ) *
1259 float velocity = veh->velocity;
1260 rl_vec2d offset = veh->move_vec();
1261 if( !veh->skidding && veh->player_in_control( u ) &&
1262 std::abs( veh->cruise_velocity - veh->velocity ) < 7 * vehicles::vmiph_per_tile ) {
1263 // Use the cruise controlled velocity, but only if
1264 // it is not too different from the actual velocity.
1265 // The actual velocity changes too often (see above slowdown).
1266 // Using it makes would make the offset change far too often.
1267 offset = veh->face_vec();
1268 velocity = veh->cruise_velocity;
1269 }
1270 float rel_offset;
1271 if( std::fabs( velocity ) < min_offset_vel ) {
1272 rel_offset = 0;
1273 } else if( std::fabs( velocity ) > max_offset_vel ) {
1274 rel_offset = ( velocity > 0 ) ? 1 : -1;
1275 } else {
1276 rel_offset = ( velocity - min_offset_vel ) / ( max_offset_vel - min_offset_vel );
1277 }
1278 // Squeeze into the corners, by making the offset vector longer,
1279 // the PC is still in view as long as both offset.x and
1280 // offset.y are <= 1
1281 if( std::fabs( offset.x ) > std::fabs( offset.y ) && std::fabs( offset.x ) > 0.2 ) {
1282 offset.y /= std::fabs( offset.x );
1283 offset.x = ( offset.x > 0 ) ? +1 : -1;
1284 } else if( std::fabs( offset.y ) > 0.2 ) {
1285 offset.x /= std::fabs( offset.y );
1286 offset.y = offset.y > 0 ? +1 : -1;
1287 }
1288 offset.x *= rel_offset;
1289 offset.y *= rel_offset;
1290 offset.x *= max_offset.x;
1291 offset.y *= max_offset.y;
1292 // [ ----@---- ] sight=6
1293 // [ --@------ ] offset=2
1294 // [ -@------# ] offset=3
1295 // can see sights square in every direction, total visible area is
1296 // (2*sight+1)x(2*sight+1), but the window is only
1297 // getmaxx(w_terrain) x getmaxy(w_terrain)
1298 // The area outside of the window is maxoff (sight-getmax/2).
1299 // If that value is <= 0, the whole visible area fits the window.
1300 // don't apply the view offset at all.
1301 // If the offset is > maxoff, only apply at most maxoff, everything
1302 // above leads to invisible area in front of the car.
1303 // It will display (getmax/2+offset) squares in one direction and
1304 // (getmax/2-offset) in the opposite direction (centered on the PC).
1305 const point maxoff( ( sight * 2 + 1 - getmaxx( w_terrain ) ) / 2,
1306 ( sight * 2 + 1 - getmaxy( w_terrain ) ) / 2 );
1307 if( maxoff.x <= 0 ) {
1308 offset.x = 0;
1309 } else if( offset.x > 0 && offset.x > maxoff.x ) {
1310 offset.x = maxoff.x;
1311 } else if( offset.x < 0 && -offset.x > maxoff.x ) {
1312 offset.x = -maxoff.x;
1313 }
1314 if( maxoff.y <= 0 ) {
1315 offset.y = 0;
1316 } else if( offset.y > 0 && offset.y > maxoff.y ) {
1317 offset.y = maxoff.y;
1318 } else if( offset.y < 0 && -offset.y > maxoff.y ) {
1319 offset.y = -maxoff.y;
1320 }
1321
1322 // Turn the offset into a vector that increments the offset toward the desired position
1323 // instead of setting it there instantly, should smooth out jerkiness.
1324 const point offset_difference( -driving_view_offset + point( offset.x, offset.y ) );
1325
1326 const point offset_sign( ( offset_difference.x < 0 ) ? -1 : 1,
1327 ( offset_difference.y < 0 ) ? -1 : 1 );
1328 // Shift the current offset in the direction of the calculated offset by one tile
1329 // per draw event, but snap to calculated offset if we're close enough to avoid jitter.
1330 offset.x = ( std::abs( offset_difference.x ) > 1 ) ?
1331 ( driving_view_offset.x + offset_sign.x ) : offset.x;
1332 offset.y = ( std::abs( offset_difference.y ) > 1 ) ?
1333 ( driving_view_offset.y + offset_sign.y ) : offset.y;
1334
1335 set_driving_view_offset( point( offset.x, offset.y ) );
1336}
int posz() const override
Definition: character.h:819
int sight_range(int light_level) const override
Returns the player's sight range.
Definition: character.cpp:726
point driving_view_offset
Definition: game.h:997
catacurses::window w_terrain
Definition: game.h:987
void set_driving_view_offset(const point &p)
Definition: game.cpp:1595
unsigned char light_level(int zlev) const
Returns coarse number-of-squares of visibility at the current light level.
Definition: game.cpp:3537
rl_vec2d move_vec() const
rl_vec2d face_vec() const
bool skidding
Definition: vehicle.h:1999
bool player_in_control(const Character &p) const
Definition: vehicle.cpp:277
int velocity
Definition: vehicle.h:1918
int cruise_velocity
Definition: vehicle.h:1920
static int veh_lumi(vehicle &veh)
Definition: game.cpp:1220
int getmaxx(const window &win)
Definition: ncurses_def.cpp:58
int getmaxy(const window &win)
Definition: ncurses_def.cpp:63
quantity< V, U > fabs(quantity< V, U > q)
Definition: units_def.h:136
constexpr float vmiph_per_tile
Definition: vehicle.h:68
static constexpr point point_zero
Definition: point.h:274
Definition: point.h:35
int y
Definition: point.h:39
int x
Definition: point.h:38
float y
Definition: point_float.h:13
float x
Definition: point_float.h:12

References vehicle::cruise_velocity, driving_view_offset, units::fabs(), vehicle::face_vec(), catacurses::getmaxx(), catacurses::getmaxy(), light_level(), vehicle::move_vec(), vehicle::player_in_control(), point_zero, Character::posz(), set_driving_view_offset(), Character::sight_range(), vehicle::skidding, u, veh_lumi(), vehicle::velocity, vehicles::vmiph_per_tile, w_terrain, point::x, rl_vec2d::x, point::y, and rl_vec2d::y.

Referenced by do_turn().

◆ cancel_activity_or_ignore_query()

bool game::cancel_activity_or_ignore_query ( distraction_type  type,
const std::string &  text 
)

Asks if the player wants to cancel their activity and if so cancels it.

Additionally checks if the player wants to ignore further distractions.

Definition at line 1697 of file game.cpp.

1698{
1700 if( u.has_distant_destination() ) {
1701 if( cancel_auto_move( u, text ) ) {
1702 return true;
1703 } else {
1705 return false;
1706 }
1707 }
1709 return false;
1710 }
1711 const bool force_uc = get_option<bool>( "FORCE_CAPITAL_YN" );
1712 const auto &allow_key = force_uc ? input_context::disallow_lower_case
1714
1715 const auto &action = query_popup()
1716 .context( "CANCEL_ACTIVITY_OR_IGNORE_QUERY" )
1717 .message( force_uc ?
1718 pgettext( "cancel_activity_or_ignore_query",
1719 "<color_light_red>%s %s (Case Sensitive)</color>" ) :
1720 pgettext( "cancel_activity_or_ignore_query",
1721 "<color_light_red>%s %s</color>" ),
1722 text, u.activity.get_stop_phrase() )
1723 .option( "YES", allow_key )
1724 .option( "NO", allow_key )
1725 .option( "MANAGER", allow_key )
1726 .option( "IGNORE", allow_key )
1727 .query()
1728 .action;
1729
1730 if( action == "YES" ) {
1732 return true;
1733 }
1734 if( action == "IGNORE" ) {
1736 for( auto &activity : u.backlog ) {
1737 activity.ignore_distraction( type );
1738 }
1739 }
1740 if( action == "MANAGER" ) {
1743 return true;
1744 }
1745
1748
1749 return false;
1750}
void set_destination(const std::vector< tripoint > &route, const player_activity &new_destination_activity=player_activity())
void cancel_activity()
Definition: character.cpp:9142
std::vector< tripoint > & get_auto_move_route()
std::list< player_activity > backlog
Definition: character.h:1549
bool has_distant_destination() const
static const input_event_filter allow_all_keys
Definition: input.h:545
static const input_event_filter disallow_lower_case
Definition: input.h:544
bool is_distraction_ignored(distraction_type type) const
std::string get_stop_phrase() const
void ignore_distraction(distraction_type type)
UI class for displaying messages or querying player input with popups.
Definition: popup.h:39
query_popup & context(const std::string &cat)
Specify the input context.
Definition: popup.cpp:21
query_popup & option(const std::string &opt)
Specify an action as an option.
Definition: popup.cpp:28
result query()
Query until a valid action or an error happens and return the result.
Definition: popup.cpp:348
query_popup & message(const std::string &fmt, Args &&... args)
Specify the query message.
Definition: popup.h:91
@ action
Definition: dialogue.h:36
distraction_manager::distraction_manager_gui & get_distraction_manager()
@ type
Definition: enums.h:75
static bool cancel_auto_move(player &p, const std::string &text)
Definition: game.cpp:1684
void redraw()
Invalidate the top window and redraw all invalidated windows.
Definition: ui_manager.cpp:389
void refresh_display()
Make changes made to the display visible to the user immediately.
std::string action
Definition: popup.h:68
const char * pgettext(const char *context, const char *msgid)

References action, query_popup::result::action, Character::activity, input_context::allow_all_keys, Character::backlog, Character::cancel_activity(), cancel_auto_move(), query_popup::context(), input_context::disallow_lower_case, Character::get_auto_move_route(), get_distraction_manager(), player_activity::get_stop_phrase(), Character::has_distant_destination(), player_activity::ignore_distraction(), invalidate_main_ui_adaptor(), player_activity::is_distraction_ignored(), query_popup::message(), query_popup::option(), pgettext(), query_popup::query(), ui_manager::redraw(), refresh_display(), Character::set_destination(), distraction_manager::distraction_manager_gui::show(), type, and u.

Referenced by mon_info_update(), monmove(), and process_voluntary_act_interrupt().

◆ cancel_activity_query()

bool game::cancel_activity_query ( const std::string &  text)

Asks if the player wants to cancel their activity, and if so cancels it.

Definition at line 1752 of file game.cpp.

1753{
1755 if( u.has_distant_destination() ) {
1756 if( cancel_auto_move( u, text ) ) {
1757 return true;
1758 } else {
1760 return false;
1761 }
1762 }
1763 if( !u.activity ) {
1764 return false;
1765 }
1766 if( query_yn( "%s %s", text, u.activity.get_stop_phrase() ) ) {
1770 return true;
1771 }
1772 return false;
1773}
void clear_destination()
void resume_backlog_activity()
Definition: character.cpp:9174

References Character::activity, Character::cancel_activity(), cancel_auto_move(), Character::clear_destination(), Character::get_auto_move_route(), player_activity::get_stop_phrase(), Character::has_distant_destination(), invalidate_main_ui_adaptor(), query_yn(), Character::resume_backlog_activity(), Character::set_destination(), and u.

Referenced by handle_key_blocking_activity().

◆ catch_a_monster()

void game::catch_a_monster ( monster fish,
const tripoint pos,
player p,
const time_duration catch_duration 
)

Picks and spawns a random fish from the remaining fish list when a fish is caught.

Definition at line 1670 of file game.cpp.

1672{
1673 //spawn the corpse, rotten by a part of the duration
1675 catch_duration ) ) );
1676 if( u.sees( pos ) ) {
1677 u.add_msg_if_player( m_good, _( "You caught a %s." ), fish->type->nname() );
1678 }
1679 //quietly kill the caught
1680 fish->no_corpse_quiet = true;
1681 fish->die( p );
1682}
bool sees(const tripoint &t, bool is_player=false, int range_mod=0) const override
static item make_corpse(const mtype_id &mt=string_id< mtype >::NULL_ID(), time_point turn=calendar::turn, const std::string &name="", int upgrade_time=-1)
Make a corpse of the given monster type.
Definition: item.cpp:507
item & add_item_or_charges(const tripoint &pos, item obj, bool overflow=true)
Adds an item to map tile or stacks charges.
Definition: map.cpp:4235
bool no_corpse_quiet
Definition: monster.h:484
void die(Creature *killer) override
Empty function.
Definition: monster.cpp:2267
const mtype * type
Definition: monster.h:480
void add_msg_if_player(const std::string &msg) const override
Definition: player.cpp:2593
time_point turn
Definition: calendar.cpp:36
mtype_id id
Definition: mtype.h:240
std::string nname(unsigned int quantity=1) const
Definition: mtype.cpp:65

References _, map::add_item_or_charges(), player::add_msg_if_player(), monster::die(), mtype::id, m, m_good, item::make_corpse(), mtype::nname(), monster::no_corpse_quiet, rng(), Character::sees(), calendar::turn, monster::type, and u.

◆ chat()

void game::chat ( )
private

Definition at line 395 of file npctalk.cpp.

396{
397 int volume = u.get_shout_volume();
398
399 const std::vector<npc *> available = get_npcs_if( [&]( const npc & guy ) {
400 // TODO: Get rid of the z-level check when z-level vision gets "better"
401 return u.posz() == guy.posz() && u.sees( guy.pos() ) &&
402 rl_dist( u.pos(), guy.pos() ) <= SEEX * 2;
403 } );
404 const int available_count = available.size();
405 const std::vector<npc *> followers = get_npcs_if( [&]( const npc & guy ) {
406 return guy.is_player_ally() && guy.is_following() && guy.can_hear( u.pos(), volume );
407 } );
408 const int follower_count = followers.size();
409 const std::vector<npc *> guards = get_npcs_if( [&]( const npc & guy ) {
410 return guy.mission == NPC_MISSION_GUARD_ALLY &&
411 guy.companion_mission_role_id != "FACTION_CAMP" &&
412 guy.can_hear( u.pos(), volume );
413 } );
414 const int guard_count = guards.size();
415
416 if( u.has_trait( trait_PROF_FOODP ) && !( u.is_wearing( itype_id( "foodperson_mask" ) ) ||
417 u.is_wearing( itype_id( "foodperson_mask_on" ) ) ) ) {
418 u.add_msg_if_player( m_warning, _( "You can't speak without your face!" ) );
419 return;
420 }
421 std::vector<vehicle *> animal_vehicles;
422 std::vector<vehicle *> following_vehicles;
423 std::vector<vehicle *> magic_vehicles;
424 std::vector<vehicle *> magic_following_vehicles;
425 for( auto &veh : m.get_vehicles() ) {
426 auto &v = veh.v;
427 if( v->has_engine_type( fuel_type_animal, false ) && v->is_owned_by( u ) ) {
428 animal_vehicles.push_back( v );
429 if( v->is_following ) {
430 following_vehicles.push_back( v );
431 }
432 }
433 if( v->magic ) {
434 for( const vpart_reference &vp : v->get_all_parts() ) {
435 const vpart_info &vpi = vp.info();
436 if( vpi.has_flag( "MAGIC_FOLLOW" ) ) {
437 magic_vehicles.push_back( v );
438 if( v->is_following ) {
439 magic_following_vehicles.push_back( v );
440 }
441 break;
442 }
443 }
444 }
445 }
446
447 uilist nmenu;
448 nmenu.text = std::string( _( "What do you want to do?" ) );
449
450 if( !available.empty() ) {
451 nmenu.addentry( NPC_CHAT_TALK, true, 't', available_count == 1 ?
452 string_format( _( "Talk to %s" ), available.front()->name ) :
453 _( "Talk to…" )
454 );
455 }
456 nmenu.addentry( NPC_CHAT_YELL, true, 'a', _( "Yell" ) );
457 nmenu.addentry( NPC_CHAT_SENTENCE, true, 'b', _( "Yell a sentence" ) );
458 if( !animal_vehicles.empty() ) {
460 _( "Whistle at your animals pulling vehicles to follow you." ) );
461 }
462 if( !magic_vehicles.empty() ) {
464 _( "Utter a magical command that will order your magical vehicles to follow you." ) );
465 }
466 if( !magic_following_vehicles.empty() ) {
468 _( "Utter a magical command that will order your magical vehicles to stop following you." ) );
469 }
470 if( !following_vehicles.empty() ) {
472 _( "Whistle at your animals pulling vehicles to stop following you." ) );
473 }
474 if( !guards.empty() ) {
475 nmenu.addentry( NPC_CHAT_FOLLOW, true, 'f', guard_count == 1 ?
476 string_format( _( "Tell %s to follow" ), guards.front()->name ) :
477 _( "Tell someone to follow…" )
478 );
479 }
480 if( !followers.empty() ) {
481 nmenu.addentry( NPC_CHAT_GUARD, true, 'g', follower_count == 1 ?
482 string_format( _( "Tell %s to guard" ), followers.front()->name ) :
483 _( "Tell someone to guard…" )
484 );
485 nmenu.addentry( NPC_CHAT_AWAKE, true, 'w', _( "Tell everyone on your team to wake up" ) );
486 nmenu.addentry( NPC_CHAT_MOUNT, true, 'M', _( "Tell everyone on your team to mount up" ) );
487 nmenu.addentry( NPC_CHAT_DISMOUNT, true, 'm', _( "Tell everyone on your team to dismount" ) );
488 nmenu.addentry( NPC_CHAT_DANGER, true, 'D',
489 _( "Tell everyone on your team to prepare for danger" ) );
490 nmenu.addentry( NPC_CHAT_CLEAR_OVERRIDES, true, 'r',
491 _( "Tell everyone on your team to relax (Clear Overrides)" ) );
492 nmenu.addentry( NPC_CHAT_ORDERS, true, 'o', _( "Tell everyone on your team to temporarily…" ) );
493 }
494 std::string message;
495 std::string yell_msg;
496 bool is_order = true;
497 nmenu.query();
498
499 if( nmenu.ret < 0 ) {
500 return;
501 }
502
503 switch( nmenu.ret ) {
504 case NPC_CHAT_TALK: {
505 const int npcselect = npc_select_menu( available, _( "Talk to whom?" ), false );
506 if( npcselect < 0 ) {
507 return;
508 }
509 available[npcselect]->talk_to_u();
510 break;
511 }
512 case NPC_CHAT_YELL:
513 is_order = false;
514 message = _( "loudly." );
515 break;
516 case NPC_CHAT_SENTENCE: {
517 std::string popupdesc = _( "Enter a sentence to yell" );
519 popup.title( _( "Yell a sentence" ) )
520 .width( 64 )
521 .description( popupdesc )
522 .identifier( "sentence" )
523 .max_length( 128 )
524 .query();
525 yell_msg = popup.text();
526 is_order = false;
527 break;
528 }
529 case NPC_CHAT_GUARD: {
530 const int npcselect = npc_select_menu( followers, _( "Who should guard here?" ) );
531 if( npcselect < 0 ) {
532 return;
533 }
534 if( npcselect == follower_count ) {
535 for( npc *them : followers ) {
537 }
538 yell_msg = _( "Everyone guard here!" );
539 } else {
540 talk_function::assign_guard( *followers[npcselect] );
541 yell_msg = string_format( _( "Guard here, %s!" ), followers[npcselect]->name );
542 }
543 break;
544 }
545 case NPC_CHAT_FOLLOW: {
546 const int npcselect = npc_select_menu( guards, _( "Who should follow you?" ) );
547 if( npcselect < 0 ) {
548 return;
549 }
550 if( npcselect == guard_count ) {
551 for( npc *them : guards ) {
553 }
554 yell_msg = _( "Everyone follow me!" );
555 } else {
556 talk_function::stop_guard( *guards[npcselect] );
557 yell_msg = string_format( _( "Follow me, %s!" ), guards[npcselect]->name );
558 }
559 break;
560 }
561 case NPC_CHAT_AWAKE:
562 for( npc *them : followers ) {
563 talk_function::wake_up( *them );
564 }
565 yell_msg = _( "Stay awake!" );
566 break;
567 case NPC_CHAT_MOUNT:
568 for( npc *them : followers ) {
569 if( them->has_effect( effect_riding ) ) {
570 continue;
571 }
573 }
574 yell_msg = _( "Mount up!" );
575 break;
577 for( npc *them : followers ) {
578 if( them->has_effect( effect_riding ) ) {
579 them->npc_dismount();
580 }
581 }
582 yell_msg = _( "Dismount!" );
583 break;
584 case NPC_CHAT_DANGER:
585 for( npc *them : followers ) {
586 them->rules.set_danger_overrides();
587 }
588 yell_msg = _( "We're in danger. Stay awake, stay close, don't go wandering off, "
589 "and don't open any doors." );
590 break;
592 for( npc *p : followers ) {
594 }
595 yell_msg = _( "As you were." );
596 break;
597 case NPC_CHAT_ORDERS:
598 npc_temp_orders_menu( followers );
599 break;
602 break;
605 break;
608 break;
611 break;
612 default:
613 return;
614 }
615
616 if( !yell_msg.empty() ) {
617 message = string_format( "\"%s\"", yell_msg );
618 }
619 if( !message.empty() ) {
620 add_msg( _( "You yell %s" ), message );
621 u.shout( string_format( _( "%s yelling %s" ), u.disp_name(), message ), is_order );
622 }
623
624 u.moves -= 100;
625}
std::string disp_name(bool possessive=false, bool capitalize_first=false) const override
Returns either "you" or the player's name.
Definition: character.cpp:553
void shout(std::string msg="", bool order=false)
Definition: character.cpp:7642
bool can_hear(const tripoint &source, int volume) const
bool is_wearing(const item &itm) const
Returns true if the player is wearing the item.
Definition: character.cpp:3297
bool has_trait(const trait_id &b) const override
Returns true if the player has the entered trait.
Definition: mutation.cpp:103
int get_shout_volume() const
Definition: character.cpp:7599
int moves
Definition: creature.h:570
std::string companion_mission_role_id
Definition: npc.h:1317
npc_mission mission
Definition: npc.h:1324
bool is_player_ally() const
Definition: npc.cpp:1987
bool is_following() const
Definition: npc.cpp:2018
Shows a window querying the user for input.
bool has_flag(const std::string &flag) const
Definition: veh_type.h:336
This is a wrapper over a vehicle pointer and a reference to a part of it.
int rl_dist(const coords::coord_point< Point, Origin, Scale > &loc1, const coords::coord_point< Point, Origin, Scale > &loc2)
Definition: coordinates.h:519
static constexpr int SEEX
std::string message
Definition: mapgen.cpp:411
std::string name(type dir)
Get Human readable name of a direction.
Definition: overmap.cpp:4127
void wake_up(npc &)
void find_mount(npc &)
void clear_overrides(npc &p)
void stop_guard(npc &)
void assign_guard(npc &)
quantity< int, volume_in_milliliter_tag > volume
Definition: units_volume.h:16
@ NPC_MISSION_GUARD_ALLY
Definition: npc.h:187
static const efftype_id effect_riding("riding")
static const trait_id trait_PROF_FOODP("PROF_FOODP")
static int npc_select_menu(const std::vector< npc * > &npc_list, const std::string &prompt, const bool everyone=true)
Definition: npctalk.cpp:221
static void tell_magic_veh_stop_following()
Definition: npctalk.cpp:378
static void tell_veh_stop_following()
Definition: npctalk.cpp:341
static void assign_veh_to_follow()
Definition: npctalk.cpp:352
static void npc_temp_orders_menu(const std::vector< npc * > &npc_list)
Definition: npctalk.cpp:253
static const itype_id fuel_type_animal("animal")
@ NPC_CHAT_MOUNT
Definition: npctalk.cpp:201
@ NPC_CHAT_COMMAND_MAGIC_VEHICLE_STOP_FOLLOW
Definition: npctalk.cpp:215
@ NPC_CHAT_YELL
Definition: npctalk.cpp:196
@ NPC_CHAT_FOLLOW
Definition: npctalk.cpp:199
@ NPC_CHAT_GUARD
Definition: npctalk.cpp:198
@ NPC_CHAT_DISMOUNT
Definition: npctalk.cpp:202
@ NPC_CHAT_ANIMAL_VEHICLE_FOLLOW
Definition: npctalk.cpp:212
@ NPC_CHAT_ORDERS
Definition: npctalk.cpp:204
@ NPC_CHAT_SENTENCE
Definition: npctalk.cpp:197
@ NPC_CHAT_CLEAR_OVERRIDES
Definition: npctalk.cpp:211
@ NPC_CHAT_DANGER
Definition: npctalk.cpp:203
@ NPC_CHAT_AWAKE
Definition: npctalk.cpp:200
@ NPC_CHAT_ANIMAL_VEHICLE_STOP_FOLLOW
Definition: npctalk.cpp:213
@ NPC_CHAT_TALK
Definition: npctalk.cpp:195
@ NPC_CHAT_COMMAND_MAGIC_VEHICLE_FOLLOW
Definition: npctalk.cpp:214
static void tell_magic_veh_to_follow()
Definition: npctalk.cpp:362
int popup(const std::string &text, PopupFlags flags)
Definition: output.cpp:764

References _, add_msg(), player::add_msg_if_player(), uilist::addentry(), talk_function::assign_guard(), assign_veh_to_follow(), available, Character::can_hear(), talk_function::clear_overrides(), npc::companion_mission_role_id, Character::disp_name(), effect_riding, talk_function::find_mount(), fuel_type_animal, get_npcs_if(), Character::get_shout_volume(), map::get_vehicles(), vpart_info::has_flag(), Character::has_trait(), npc::is_following(), npc::is_player_ally(), Character::is_wearing(), m, m_warning, mapgen_defer::message, npc::mission, Creature::moves, om_direction::name(), NPC_CHAT_ANIMAL_VEHICLE_FOLLOW, NPC_CHAT_ANIMAL_VEHICLE_STOP_FOLLOW, NPC_CHAT_AWAKE, NPC_CHAT_CLEAR_OVERRIDES, NPC_CHAT_COMMAND_MAGIC_VEHICLE_FOLLOW, NPC_CHAT_COMMAND_MAGIC_VEHICLE_STOP_FOLLOW, NPC_CHAT_DANGER, NPC_CHAT_DISMOUNT, NPC_CHAT_FOLLOW, NPC_CHAT_GUARD, NPC_CHAT_MOUNT, NPC_CHAT_ORDERS, NPC_CHAT_SENTENCE, NPC_CHAT_TALK, NPC_CHAT_YELL, NPC_MISSION_GUARD_ALLY, npc_select_menu(), npc_temp_orders_menu(), popup(), Character::pos(), Character::posz(), uilist::query(), uilist::ret, rl_dist(), Character::sees(), SEEX, Character::shout(), talk_function::stop_guard(), string_format(), tell_magic_veh_stop_following(), tell_magic_veh_to_follow(), tell_veh_stop_following(), uilist::text, trait_PROF_FOODP, u, and talk_function::wake_up().

Referenced by handle_action().

◆ check_near_zone()

bool game::check_near_zone ( const zone_type_id type,
const tripoint where 
) const

Checks whether or not there is a zone of particular type nearby.

Definition at line 5983 of file game.cpp.

5984{
5985 return zone_manager::get_manager().has_near( type, m.getabs( where ) );
5986}
static zone_manager & get_manager()
Definition: clzones.cpp:126
bool has_near(const zone_type_id &type, const tripoint &where, int range=MAX_DISTANCE, const faction_id &fac=your_fac) const
Definition: clzones.cpp:702

References zone_manager::get_manager(), map::getabs(), zone_manager::has_near(), m, and type.

◆ check_safe_mode_allowed()

bool game::check_safe_mode_allowed ( bool  repeat_safe_mode_warnings = true)

Check whether movement is allowed according to safe mode settings.

Returns
true if the movement is allowed, otherwise false.

Definition at line 8518 of file game.cpp.

8519{
8520 if( !repeat_safe_mode_warnings && safe_mode_warning_logged ) {
8521 // Already warned player since safe_mode_warning_logged is set.
8522 return false;
8523 }
8524
8525 std::string msg_ignore = press_x( ACTION_IGNORE_ENEMY );
8526 if( !msg_ignore.empty() ) {
8527 std::wstring msg_ignore_wide = utf8_to_wstr( msg_ignore );
8528 // Operate on a wide-char basis to prevent corrupted multi-byte string
8529 msg_ignore_wide[0] = towlower( msg_ignore_wide[0] );
8530 msg_ignore = wstr_to_utf8( msg_ignore_wide );
8531 }
8532
8534 // Automatic and mandatory safemode. Make BLOODY sure the player notices!
8535 if( u.get_int_base() < 5 || u.has_trait( trait_id( "PROF_CHURL" ) ) ) {
8537 _( "There's an angry red dot on your body, %s to brush it off." ), msg_ignore );
8538 } else {
8540 _( "You are being laser-targeted, %s to ignore." ), msg_ignore );
8541 }
8543 return false;
8544 }
8545 if( safe_mode != SAFE_MODE_STOP ) {
8546 return true;
8547 }
8548 // Currently driving around, ignore the monster, they have no chance against a proper car anyway (-:
8549 if( u.controlling_vehicle && !get_option<bool>( "SAFEMODEVEH" ) ) {
8550 return true;
8551 }
8552 // Monsters around and we don't want to run
8553 std::string spotted_creature_name;
8554 const monster_visible_info &mon_visible = u.get_mon_visible();
8555 const auto &new_seen_mon = mon_visible.new_seen_mon;
8556
8557 if( new_seen_mon.empty() ) {
8558 // naming consistent with code in game::mon_info
8559 spotted_creature_name = _( "a survivor" );
8561 } else {
8562 spotted_creature_name = new_seen_mon.back()->name();
8563 get_safemode().lastmon_whitelist = spotted_creature_name;
8564 }
8565
8566 std::string whitelist;
8567 if( !get_safemode().empty() ) {
8568 whitelist = string_format( _( " or %s to whitelist the monster" ),
8570 }
8571
8572 const std::string msg_safe_mode = press_x( ACTION_TOGGLE_SAFEMODE );
8574 _( "Spotted %1$s--safe mode is on! (%2$s to turn it off, %3$s to ignore monster%4$s)" ),
8575 spotted_creature_name, msg_safe_mode, msg_ignore, whitelist );
8577 return false;
8578}
std::string press_x(action_id act)
Definition: action.cpp:457
@ ACTION_IGNORE_ENEMY
Ignore the enemy that triggered safemode.
Definition: action.h:221
@ ACTION_WHITELIST_ENEMY
Whitelist the enemy that triggered safemode.
Definition: action.h:223
@ ACTION_TOGGLE_SAFEMODE
Turn safemode on/off, while leaving autosafemode intact.
Definition: action.h:215
std::wstring utf8_to_wstr(const std::string &str)
std::string wstr_to_utf8(const std::wstring &wstr)
bool has_effect(const efftype_id &eff_id, body_part bp=num_bp) const
Check if creature has the matching effect.
Definition: creature.cpp:1184
int get_int_base() const override
Definition: avatar.cpp:1022
monster_visible_info & get_mon_visible()
Definition: avatar.h:219
std::string lastmon_whitelist
Definition: safemode_ui.h:87
std::string npc_type_name()
Definition: safemode_ui.cpp:44
@ gmf_bypass_cooldown
Definition: enums.h:288
static const efftype_id effect_laserlocked("laserlocked")
@ SAFE_MODE_STOP
Definition: game.h:79
safemode & get_safemode()
Definition: safemode_ui.cpp:33
Structure allowing a combination of game_message_type and game_message_flags.
Definition: enums.h:293
std::vector< shared_ptr_fast< monster > > new_seen_mon
Definition: avatar.h:41

References _, ACTION_IGNORE_ENEMY, ACTION_TOGGLE_SAFEMODE, ACTION_WHITELIST_ENEMY, add_msg(), Character::controlling_vehicle, effect_laserlocked, avatar::get_int_base(), avatar::get_mon_visible(), get_safemode(), gmf_bypass_cooldown, Creature::has_effect(), Character::has_trait(), safemode::lastmon_whitelist, m_warning, monster_visible_info::new_seen_mon, safemode::npc_type_name(), press_x(), safe_mode, SAFE_MODE_STOP, safe_mode_warning_logged, string_format(), u, utf8_to_wstr(), and wstr_to_utf8().

Referenced by handle_action().

◆ check_zone()

bool game::check_zone ( const zone_type_id type,
const tripoint where 
) const

Definition at line 5978 of file game.cpp.

5979{
5980 return zone_manager::get_manager().has( type, m.getabs( where ) );
5981}
bool has(const zone_type_id &type, const tripoint &where, const faction_id &fac=your_fac) const
Definition: clzones.cpp:694

References zone_manager::get_manager(), map::getabs(), zone_manager::has(), m, and type.

Referenced by place_player().

◆ cleanup_at_end()

bool game::cleanup_at_end ( )

Definition at line 934 of file game.cpp.

935{
936 if( uquit == QUIT_DIED || uquit == QUIT_SUICIDE ) {
937 // Put (non-hallucinations) into the overmap so they are not lost.
938 for( monster &critter : all_monsters() ) {
939 despawn_monster( critter );
940 }
941 // Reset NPC factions and disposition
943 // Save the factions', missions and set the NPC's overmap coordinates
944 // Npcs are saved in the overmap.
945 save_factions_missions_npcs(); //missions need to be saved as they are global for all saves.
946 // save artifacts.
948
949 // and the overmap, and the local map.
950 save_maps(); //Omap also contains the npcs who need to be saved.
951 }
952
953 if( uquit == QUIT_DIED || uquit == QUIT_SUICIDE ) {
954 std::vector<std::string> vRip;
955
956 int iMaxWidth = 0;
957 int iNameLine = 0;
958 int iInfoLine = 0;
959
962 if( !( u.has_trait( trait_id( "CANNIBAL" ) ) || u.has_trait( trait_id( "PSYCHOPATH" ) ) ) ) {
963 vRip.emplace_back( " _______ ___" );
964 vRip.emplace_back( " < `/ |" );
965 vRip.emplace_back( " > _ _ (" );
966 vRip.emplace_back( " | |_) | |_) |" );
967 vRip.emplace_back( " | | \\ | | |" );
968 vRip.emplace_back( " ______.__%_| |_________ __" );
969 vRip.emplace_back( " _/ \\| |" );
970 iNameLine = vRip.size();
971 vRip.emplace_back( "| <" );
972 vRip.emplace_back( "| |" );
973 iMaxWidth = utf8_width( vRip.back() );
974 vRip.emplace_back( "| |" );
975 vRip.emplace_back( "|_____.-._____ __/|_________|" );
976 vRip.emplace_back( " | |" );
977 iInfoLine = vRip.size();
978 vRip.emplace_back( " | |" );
979 vRip.emplace_back( " | <" );
980 vRip.emplace_back( " | |" );
981 vRip.emplace_back( " | _ |" );
982 vRip.emplace_back( " |__/ |" );
983 vRip.emplace_back( " % / `--. |%" );
984 vRip.emplace_back( " * .%%| -< @%%%" ); // NOLINT(cata-text-style)
985 vRip.emplace_back( " `\\%`@| |@@%@%%" );
986 vRip.emplace_back( " .%%%@@@|% ` % @@@%%@%%%%" );
987 vRip.emplace_back( " _.%%%%%%@@@@@@%%%__/\\%@@%%@@@@@@@%%%%%%" );
988
989 } else {
990 vRip.emplace_back( " _______ ___" );
991 vRip.emplace_back( " | \\/ |" );
992 vRip.emplace_back( " | |" );
993 vRip.emplace_back( " | |" );
994 iInfoLine = vRip.size();
995 vRip.emplace_back( " | |" );
996 vRip.emplace_back( " | |" );
997 vRip.emplace_back( " | |" );
998 vRip.emplace_back( " | |" );
999 vRip.emplace_back( " | <" );
1000 vRip.emplace_back( " | _ |" );
1001 vRip.emplace_back( " |__/ |" );
1002 vRip.emplace_back( " ______.__%_| |__________ _" );
1003 vRip.emplace_back( " _/ \\| \\" );
1004 iNameLine = vRip.size();
1005 vRip.emplace_back( "| <" );
1006 vRip.emplace_back( "| |" );
1007 iMaxWidth = utf8_width( vRip.back() );
1008 vRip.emplace_back( "| |" );
1009 vRip.emplace_back( "|_____.-._______ __/|__________|" );
1010 vRip.emplace_back( " % / `_-. _ |%" );
1011 vRip.emplace_back( " * .%%| |_) | |_)< @%%%" ); // NOLINT(cata-text-style)
1012 vRip.emplace_back( " `\\%`@| | \\ | | |@@%@%%" );
1013 vRip.emplace_back( " .%%%@@@|% ` % @@@%%@%%%%" );
1014 vRip.emplace_back( " _.%%%%%%@@@@@@%%%__/\\%@@%%@@@@@@@%%%%%%" );
1015 }
1016 } else {
1017 vRip.emplace_back( R"( _________ ____ )" );
1018 vRip.emplace_back( R"( _/ `/ \_ )" );
1019 vRip.emplace_back( R"( _/ _ _ \_. )" );
1020 vRip.emplace_back( R"( _%\ |_) | |_) \_ )" );
1021 vRip.emplace_back( R"( _/ \/ | \ | | \_ )" );
1022 vRip.emplace_back( R"( _/ \_ )" );
1023 vRip.emplace_back( R"(| |)" );
1024 iNameLine = vRip.size();
1025 vRip.emplace_back( R"( ) < )" );
1026 vRip.emplace_back( R"(| |)" );
1027 vRip.emplace_back( R"(| |)" );
1028 vRip.emplace_back( R"(| _ |)" );
1029 vRip.emplace_back( R"(|__/ |)" );
1030 iMaxWidth = utf8_width( vRip.back() );
1031 vRip.emplace_back( R"( / `--. |)" );
1032 vRip.emplace_back( R"(| ( )" );
1033 iInfoLine = vRip.size();
1034 vRip.emplace_back( R"(| |)" );
1035 vRip.emplace_back( R"(| |)" );
1036 vRip.emplace_back( R"(| % . |)" );
1037 vRip.emplace_back( R"(| @` %% |)" );
1038 vRip.emplace_back( R"(| %@%@%\ * %`%@%|)" );
1039 vRip.emplace_back( R"(%%@@@.%@%\%% `\ %%.%%@@%@)" );
1040 vRip.emplace_back( R"(@%@@%%%%%@@@@@@%%%%%%%%@@%%@@@%%%@%%@)" );
1041 }
1042
1043 const int iOffsetX = TERMX > FULL_SCREEN_WIDTH ? ( TERMX - FULL_SCREEN_WIDTH ) / 2 : 0;
1044 const int iOffsetY = TERMY > FULL_SCREEN_HEIGHT ? ( TERMY - FULL_SCREEN_HEIGHT ) / 2 : 0;
1045
1047 point( iOffsetX, iOffsetY ) );
1048 draw_border( w_rip );
1049
1050 sfx::do_player_death_hurt( g->u, true );
1055
1056 for( size_t iY = 0; iY < vRip.size(); ++iY ) {
1057 size_t iX = 0;
1058 const char *str = vRip[iY].data();
1059 for( int slen = vRip[iY].size(); slen > 0; ) {
1060 const uint32_t cTemp = UTF8_getch( &str, &slen );
1061 if( cTemp != U' ' ) {
1062 nc_color ncColor = c_light_gray;
1063
1064 if( cTemp == U'%' ) {
1065 ncColor = c_green;
1066
1067 } else if( cTemp == U'_' || cTemp == U'|' ) {
1068 ncColor = c_white;
1069
1070 } else if( cTemp == U'@' ) {
1071 ncColor = c_brown;
1072
1073 } else if( cTemp == U'*' ) {
1074 ncColor = c_red;
1075 }
1076
1077 mvwputch( w_rip, point( iX + FULL_SCREEN_WIDTH / 2 - ( iMaxWidth / 2 ), iY + 1 ), ncColor,
1078 cTemp );
1079 }
1080 iX += mk_wcwidth( cTemp );
1081 }
1082 }
1083
1084 std::string sTemp;
1085
1086 center_print( w_rip, iInfoLine++, c_white, _( "Survived:" ) );
1087
1089 const int minutes = to_minutes<int>( survived ) % 60;
1090 const int hours = to_hours<int>( survived ) % 24;
1091 const int days = to_days<int>( survived );
1092
1093 if( days > 0 ) {
1094 sTemp = string_format( "%dd %dh %dm", days, hours, minutes );
1095 } else if( hours > 0 ) {
1096 sTemp = string_format( "%dh %dm", hours, minutes );
1097 } else {
1098 sTemp = string_format( "%dm", minutes );
1099 }
1100
1101 center_print( w_rip, iInfoLine++, c_white, sTemp );
1102
1103 const int iTotalKills = get_kill_tracker().monster_kill_count();
1104
1105 sTemp = _( "Kills:" );
1106 mvwprintz( w_rip, point( FULL_SCREEN_WIDTH / 2 - 5, 1 + iInfoLine++ ), c_light_gray,
1107 ( sTemp + " " ) );
1108 wprintz( w_rip, c_magenta, "%d", iTotalKills );
1109
1110 sTemp = _( "In memory of:" );
1111 mvwprintz( w_rip, point( FULL_SCREEN_WIDTH / 2 - utf8_width( sTemp ) / 2, iNameLine++ ),
1113 sTemp );
1114
1115 sTemp = u.name;
1116 mvwprintz( w_rip, point( FULL_SCREEN_WIDTH / 2 - utf8_width( sTemp ) / 2, iNameLine++ ), c_white,
1117 sTemp );
1118
1119 sTemp = _( "Last Words:" );
1120 mvwprintz( w_rip, point( FULL_SCREEN_WIDTH / 2 - utf8_width( sTemp ) / 2, iNameLine++ ),
1122 sTemp );
1123
1124 int iStartX = FULL_SCREEN_WIDTH / 2 - ( ( iMaxWidth - 4 ) / 2 );
1125 std::string sLastWords = string_input_popup()
1126 .window( w_rip, point( iStartX, iNameLine ), iStartX + iMaxWidth - 4 - 1 )
1127 .max_length( iMaxWidth - 4 - 1 )
1128 .query_string();
1129 death_screen();
1130 const bool is_suicide = uquit == QUIT_SUICIDE;
1131 events().send<event_type::game_over>( is_suicide, sLastWords );
1132 // Struck the save_player_data here to forestall Weirdness
1133 std::string char_filename = generate_memorial_filename( u.name );
1134 move_save_to_graveyard( char_filename );
1135 write_memorial_file( char_filename, sLastWords );
1136 memorial().clear();
1137 std::vector<std::string> characters = list_active_characters();
1138 // remove current player from the active characters list, as they are dead
1139 std::vector<std::string>::iterator curchar = std::find( characters.begin(),
1140 characters.end(), u.name );
1141 if( curchar != characters.end() ) {
1142 characters.erase( curchar );
1143 }
1144
1145 if( characters.empty() ) {
1146 bool queryDelete = false;
1147 bool queryReset = false;
1148
1149 if( get_option<std::string>( "WORLD_END" ) == "query" ) {
1150 bool decided = false;
1151 std::string buffer = _( "Warning: NPC interactions and some other global flags "
1152 "will not all reset when starting a new character in an "
1153 "already-played world. This can lead to some strange "
1154 "behavior.\n\n"
1155 "Are you sure you wish to keep this world?"
1156 );
1157
1158 while( !decided ) {
1159 uilist smenu;
1160 smenu.allow_cancel = false;
1161 smenu.addentry( 0, true, 'r', "%s", _( "Reset world" ) );
1162 smenu.addentry( 1, true, 'd', "%s", _( "Delete world" ) );
1163 smenu.addentry( 2, true, 'k', "%s", _( "Keep world" ) );
1164 smenu.query();
1165
1166 switch( smenu.ret ) {
1167 case 0:
1168 queryReset = true;
1169 decided = true;
1170 break;
1171 case 1:
1172 queryDelete = true;
1173 decided = true;
1174 break;
1175 case 2:
1176 decided = query_yn( buffer );
1177 break;
1178 }
1179 }
1180 }
1181
1182 if( queryDelete || get_option<std::string>( "WORLD_END" ) == "delete" ) {
1183 world_generator->delete_world( world_generator->active_world->world_name, true );
1184
1185 } else if( queryReset || get_option<std::string>( "WORLD_END" ) == "reset" ) {
1186 world_generator->delete_world( world_generator->active_world->world_name, false );
1187 }
1188 } else if( get_option<std::string>( "WORLD_END" ) != "keep" ) {
1189 std::string tmpmessage;
1190 for( auto &character : characters ) {
1191 tmpmessage += "\n ";
1192 tmpmessage += character;
1193 }
1194 popup( _( "World retained. Characters remaining:%s" ), tmpmessage );
1195 }
1196 if( gamemode ) {
1197 gamemode = std::make_unique<special_game>(); // null gamemode or something..
1198 }
1199 }
1200
1201 //Reset any offset due to driving
1203
1204 //clear all sound channels
1210
1211 MAPBUFFER.reset();
1213
1214#if defined(__ANDROID__)
1215 quick_shortcuts_map.clear();
1216#endif
1217 return true;
1218}
uint32_t UTF8_getch(const char **src, int *srclen)
Definition: catacharset.cpp:18
int utf8_width(const char *s, const bool ignore_tags)
std::string name
Definition: character.h:1536
A wrapper over a pointer to a curses window.
Definition: cursesdef.h:55
void send(const cata::event &) const
Definition: event_bus.cpp:58
void move_save_to_graveyard(const std::string &dirname)
Definition: game.cpp:2460
bool save_maps()
Definition: game.cpp:2660
std::unique_ptr< special_game > gamemode
Definition: game.h:1055
void death_screen()
Definition: game.cpp:2409
monster_range all_monsters()
Same as all_creatures but iterators only over monsters.
Definition: game.cpp:11941
bool save_factions_missions_npcs()
Definition: game.cpp:2646
void despawn_monster(monster &critter)
Despawn a specific monster, it's stored on the overmap.
Definition: game.cpp:10964
const kill_tracker & get_kill_tracker() const
Definition: game.cpp:872
void write_memorial_file(const std::string &filename, std::string sLastWords)
Writes information about the character out to a text file timestamped with the time of the file was m...
Definition: game.cpp:2759
std::vector< std::string > list_active_characters()
Returns a list of currently active character saves.
Definition: game.cpp:2744
bool save_artifacts()
Definition: game.cpp:2654
memorial_logger & memorial()
Definition: game.cpp:2709
void reset_npc_dispositions()
Definition: game.cpp:2618
int monster_kill_count() const
void reset()
Delete all buffered submaps.
Definition: mapbuffer.cpp:49
string_input_popup & max_length(int value)
Maximal amount of Unicode characters that can be given by the user.
const std::string & query_string(bool loop=true, bool draw_only=false)
string_input_popup & window(const catacurses::window &w, const point &start, int endx)
Set the window area where to display the input text.
A duration defined as a number of specific time units.
Definition: calendar.h:180
bool allow_cancel
Definition: ui.h:362
bool has_amount(const itype_id &what, int qty, bool pseudo=true, const std::function< bool(const item &)> &filter=return_true< item >) const
Check instance provides at least qty of an item (.
Definition: visitable.cpp:1108
#define c_white
Definition: color.h:18
#define c_light_gray
Definition: color.h:19
#define c_green
Definition: color.h:22
#define c_magenta
Definition: color.h:25
#define c_brown
Definition: color.h:26
#define c_red
Definition: color.h:21
static const itype_id itype_holybook_bible1("holybook_bible1")
static std::string generate_memorial_filename(const std::string &char_name)
Definition: game.cpp:907
static const itype_id itype_holybook_bible2("holybook_bible2")
static const itype_id itype_holybook_bible3("holybook_bible3")
std::unique_ptr< game > g
Definition: game.cpp:277
@ QUIT_DIED
Definition: game.h:72
@ QUIT_SUICIDE
Definition: game.h:69
const time_point & start_of_cataclysm
Definition: calendar.cpp:33
window newwin(int nlines, int ncols, const point &begin)
Definition: ncurses_def.cpp:34
FMT_CONSTEXPR bool find(Ptr first, Ptr last, T value, Ptr &out)
const size_t size
Definition: om_direction.h:27
void do_player_death_hurt(const player &target, bool death)
Definition: sounds.cpp:1633
void fade_audio_channel(channel channel, int duration)
Definition: sounds.cpp:1618
void fade_audio_group(group group, int duration)
Definition: sounds.cpp:1617
int TERMX
Definition: output.cpp:47
void mvwprintz(const catacurses::window &w, const point &p, const nc_color &FG, const std::string &text)
Definition: output.cpp:2035
int FULL_SCREEN_HEIGHT
Definition: output.cpp:56
int TERMY
Definition: output.cpp:48
void center_print(const catacurses::window &w, const int y, const nc_color &FG, const std::string &text)
Definition: output.cpp:446
void wprintz(const catacurses::window &w, const nc_color &FG, const std::string &text)
Definition: output.cpp:2043
int FULL_SCREEN_WIDTH
Definition: output.cpp:55
void mvwputch(const catacurses::window &w, const point &p, nc_color FG, int ch)
Definition: output.cpp:477
void draw_border(const catacurses::window &w, nc_color border_color, const std::string &title, nc_color title_color)
Definition: output.cpp:575
overmapbuffer overmap_buffer
int mk_wcwidth(uint32_t ucs)
Definition: wcwidth.cpp:94

References _, uilist::addentry(), all_monsters(), uilist::allow_cancel, sfx::any, c_brown, c_green, c_light_gray, c_magenta, c_red, c_white, center_print(), memorial_logger::clear(), overmapbuffer::clear(), sfx::context_themes, death_screen(), despawn_monster(), sfx::do_player_death_hurt(), draw_border(), events(), sfx::fade_audio_channel(), sfx::fade_audio_group(), sfx::fatigue, detail::find(), FULL_SCREEN_HEIGHT, FULL_SCREEN_WIDTH, g, game_over, gamemode, generate_memorial_filename(), get_kill_tracker(), visitable< T >::has_amount(), Character::has_trait(), itype_holybook_bible1, itype_holybook_bible2, itype_holybook_bible3, list_active_characters(), MAPBUFFER, string_input_popup::max_length(), memorial(), mk_wcwidth(), kill_tracker::monster_kill_count(), move_save_to_graveyard(), mvwprintz(), mvwputch(), Character::name, catacurses::newwin(), overmap_buffer, point_zero, popup(), uilist::query(), string_input_popup::query_string(), query_yn(), QUIT_DIED, QUIT_SUICIDE, mapbuffer::reset(), reset_npc_dispositions(), uilist::ret, save_artifacts(), save_factions_missions_npcs(), save_maps(), event_bus::send(), set_driving_view_offset(), om_direction::size, calendar::start_of_cataclysm, string_format(), TERMX, TERMY, sfx::time_of_day, calendar::turn, u, uquit, UTF8_getch(), utf8_width(), sfx::weather, string_input_popup::window(), world_generator, wprintz(), and write_memorial_file().

Referenced by do_turn().

◆ cleanup_dead()

void game::cleanup_dead ( )

Definition at line 4013 of file game.cpp.

4014{
4015 // Dead monsters need to stay in the tracker until everything else that needs to die does so
4016 // This is because dying monsters can still interact with other dying monsters (@ref Creature::killer)
4017 bool monster_is_dead = critter_tracker->kill_marked_for_death();
4018
4019 bool npc_is_dead = false;
4020 // can't use all_npcs as that does not include dead ones
4021 for( const auto &n : active_npc ) {
4022 if( n->is_dead() ) {
4023 n->die( nullptr ); // make sure this has been called to create corpses etc.
4024 npc_is_dead = true;
4025 }
4026 }
4027
4028 if( monster_is_dead ) {
4029 // From here on, pointers to creatures get invalidated as dead creatures get removed.
4030 critter_tracker->remove_dead();
4031 }
4032
4033 if( npc_is_dead ) {
4034 for( auto it = active_npc.begin(); it != active_npc.end(); ) {
4035 if( ( *it )->is_dead() ) {
4036 remove_npc_follower( ( *it )->getID() );
4037 overmap_buffer.remove_npc( ( *it )->getID() );
4038 it = active_npc.erase( it );
4039 } else {
4040 it++;
4041 }
4042 }
4043 }
4044
4045 critter_died = false;
4046}
void remove_npc_follower(const character_id &id)
Remove follower id from follower set.
Definition: game.cpp:1877
pimpl< Creature_tracker > critter_tracker
Definition: game.h:973
std::list< shared_ptr_fast< npc > > active_npc
Definition: game.h:1037
bool critter_died
Has anything died in this turn and needs to be cleaned up?
Definition: game.h:1049
shared_ptr_fast< npc > remove_npc(const character_id &id)
Find npc by id and if found, erase it from the npc list and return it ( or return nullptr if not foun...

References active_npc, critter_died, critter_tracker, overmap_buffer, overmapbuffer::remove_npc(), and remove_npc_follower().

Referenced by do_turn(), and monmove().

◆ clear_zombies()

void game::clear_zombies ( )

Redirects to the creature_tracker clear() function.

Definition at line 4689 of file game.cpp.

4690{
4691 critter_tracker->clear();
4692}

References critter_tracker.

Referenced by setup().

◆ control_vehicle()

void game::control_vehicle ( )
private

Definition at line 5135 of file game.cpp.

5136{
5137 static const itype_id fuel_type_animal( "animal" );
5138 int veh_part = -1;
5139 vehicle *veh = remoteveh();
5140 if( veh == nullptr ) {
5141 if( const optional_vpart_position vp = m.veh_at( u.pos() ) ) {
5142 veh = &vp->vehicle();
5143 veh_part = vp->part_index();
5144 }
5145 }
5146 if( veh != nullptr && veh->player_in_control( u ) &&
5147 veh->avail_part_with_feature( veh_part, "CONTROLS", true ) >= 0 ) {
5148 veh->use_controls( u.pos() );
5149 } else if( veh && veh->player_in_control( u ) &&
5150 veh->avail_part_with_feature( veh_part, "CONTROL_ANIMAL", true ) >= 0 ) {
5151 u.controlling_vehicle = false;
5152 add_msg( m_info, _( "You let go of the reins." ) );
5153 } else if( veh && ( veh->avail_part_with_feature( veh_part, "CONTROLS", true ) >= 0 ||
5154 ( veh->avail_part_with_feature( veh_part, "CONTROL_ANIMAL", true ) >= 0 &&
5155 veh->has_engine_type( fuel_type_animal, false ) && veh->has_harnessed_animal() ) ) &&
5156 u.in_vehicle ) {
5157 if( u.has_trait( trait_WAYFARER ) ) {
5158 add_msg( m_info, _( "You refuse to take control of this vehicle." ) );
5159 return;
5160 }
5161 if( !veh->interact_vehicle_locked() ) {
5162 veh->handle_potential_theft( dynamic_cast<player &>( u ) );
5163 return;
5164 }
5165 if( veh->engine_on ) {
5166 if( !veh->handle_potential_theft( dynamic_cast<player &>( u ) ) ) {
5167 return;
5168 }
5169 u.controlling_vehicle = true;
5170 add_msg( _( "You take control of the %s." ), veh->name );
5171 } else {
5172 if( !veh->handle_potential_theft( dynamic_cast<player &>( u ) ) ) {
5173 return;
5174 }
5175 veh->start_engines( true );
5176 }
5177 } else { // Start looking for nearby vehicle controls.
5178 int num_valid_controls = 0;
5179 cata::optional<tripoint> vehicle_position;
5180 cata::optional<vpart_reference> vehicle_controls;
5181 for( const tripoint elem : m.points_in_radius( g->u.pos(), 1 ) ) {
5182 if( const optional_vpart_position vp = m.veh_at( elem ) ) {
5183 const cata::optional<vpart_reference> controls = vp.value().part_with_feature( "CONTROLS", true );
5184 if( controls ) {
5185 num_valid_controls++;
5186 vehicle_position = elem;
5187 vehicle_controls = controls;
5188 }
5189 }
5190 }
5191 if( num_valid_controls < 1 ) {
5192 add_msg( _( "No vehicle controls found." ) );
5193 return;
5194 } else if( num_valid_controls > 1 ) {
5195 vehicle_position = choose_adjacent( _( "Control vehicle where?" ) );
5196 if( !vehicle_position ) {
5197 return;
5198 }
5199 const optional_vpart_position vp = m.veh_at( *vehicle_position );
5200 if( vp ) {
5201 vehicle_controls = vp.value().part_with_feature( "CONTROLS", true );
5202 if( !vehicle_controls ) {
5203 add_msg( _( "The vehicle doesn't have controls there." ) );
5204 return;
5205 }
5206 } else {
5207 add_msg( _( "No vehicle there." ) );
5208 return;
5209 }
5210 }
5211 // If we hit neither of those, there's only one set of vehicle controls, which should already have been found.
5212 if( vehicle_controls ) {
5213 veh = &vehicle_controls->vehicle();
5214 if( !veh->handle_potential_theft( dynamic_cast<player &>( u ) ) ) {
5215 return;
5216 }
5217 veh->use_controls( *vehicle_position );
5218 //May be folded up (destroyed), so need to re-get it
5219 veh = g->remoteveh();
5220 }
5221 }
5222 if( veh ) {
5223 // If we reached here, we gained control of a vehicle.
5224 // Clear the map memory for the area covered by the vehicle to eliminate ghost vehicles.
5225 for( const tripoint &target : veh->get_points() ) {
5226 u.clear_memorized_tile( m.getabs( target ) );
5227 }
5228 veh->is_following = false;
5229 veh->is_patrolling = false;
5230 veh->autopilot_on = false;
5231 veh->is_autodriving = false;
5232 }
5233}
cata::optional< tripoint > choose_adjacent(const std::string &message, const bool allow_vertical)
Request player input of adjacent tile, possibly including vertical tiles.
Definition: action.cpp:1026
bool in_vehicle
Definition: character.h:1543
void clear_memorized_tile(const tripoint &pos)
Definition: avatar.cpp:168
vehicle * remoteveh()
Returns the current remotely controlled vehicle.
Definition: game.cpp:2245
tripoint_range< tripoint > points_in_radius(const tripoint &center, size_t radius, size_t radiusz=0) const
Definition: map.cpp:8619
optional_vpart_position veh_at(const tripoint &p) const
Checks if tile is occupied by vehicle and by which part.
Definition: map.cpp:1009
Simple wrapper to forward functions that may return a cata::optional to vpart_position.
Definition: player.h:84
bool engine_on
Definition: vehicle.h:1989
std::set< tripoint > & get_points(bool force_refresh=false)
Definition: vehicle.cpp:6760
bool handle_potential_theft(player &p, bool check_only=false, bool prompt=true)
Definition: vehicle.cpp:4377
std::string name
Definition: vehicle.h:1849
bool has_engine_type(const itype_id &ft, bool enabled) const
Definition: vehicle.cpp:1031
void start_engines(bool take_control=false, bool autodrive=false)
void use_controls(const tripoint &pos)
Operate vehicle controls.
vehicle(const vproto_id &type_id, int init_veh_fuel=-1, int init_veh_status=-1)
Definition: vehicle.cpp:251
bool has_harnessed_animal() const
bool interact_vehicle_locked()
int avail_part_with_feature(int p, const std::string &f, bool unbroken) const
Definition: vehicle.cpp:2545
bool autopilot_on
Definition: vehicle.h:1997
bool is_autodriving
Definition: vehicle.h:1982
cata::optional< vpart_reference > part_with_feature(const std::string &f, bool unbroken) const
Definition: vehicle.cpp:2461
static const trait_id trait_WAYFARER("WAYFARER")

References _, add_msg(), vehicle::autopilot_on, vehicle::avail_part_with_feature(), choose_adjacent(), avatar::clear_memorized_tile(), Character::controlling_vehicle, vehicle::engine_on, fuel_type_animal, g, vehicle::get_points(), map::getabs(), vehicle::handle_potential_theft(), vehicle::has_engine_type(), vehicle::has_harnessed_animal(), Character::has_trait(), Character::in_vehicle, vehicle::interact_vehicle_locked(), vehicle::is_autodriving, vehicle::is_following, vehicle::is_patrolling, m, m_info, vehicle::name, vpart_position::part_with_feature(), vehicle::player_in_control(), map::points_in_radius(), Character::pos(), remoteveh(), vehicle::start_engines(), trait_WAYFARER, u, vehicle::use_controls(), cata::optional< T >::value(), map::veh_at(), and vehicle::vehicle().

Referenced by handle_action().

◆ create_or_get_main_ui_adaptor()

shared_ptr_fast< ui_adaptor > game::create_or_get_main_ui_adaptor ( )

In tiles mode w_terrain can have a different font (with a different tile dimension) or can be drawn by cata_tiles which uses tiles that again might have a different dimension then the normal font used everywhere else.

TERRAIN_WINDOW_WIDTH/TERRAIN_WINDOW_HEIGHT defines how many squares can be displayed in w_terrain (using it's specific tile dimension), not including partially drawn squares at the right/bottom. You should use it whenever you want to draw specific squares in that window or to determine whether a specific square is draw on screen (or outside the screen and needs scrolling).

TERRAIN_WINDOW_TERM_WIDTH/TERRAIN_WINDOW_TERM_HEIGHT defines the size of w_terrain in the standard font dimension (the font that everything else uses). You usually don't have to use it, expect for positioning of windows, because the window positions use the standard font dimension.

The code here calculates size available for w_terrain, caps it at max_view_size (the maximal view range than any character can have at any time). It is stored in TERRAIN_WINDOW_*.

Definition at line 2896 of file game.cpp.

2897{
2899 if( !ui ) {
2900 main_ui_adaptor = ui = make_shared_fast<ui_adaptor>();
2901 ui->on_redraw( []( const ui_adaptor & ) {
2902 g->draw();
2903 } );
2904 ui->on_screen_resize( [this]( ui_adaptor & ui ) {
2905 // remove some space for the sidebar, this is the maximal space
2906 // (using standard font) that the terrain window can have
2907 const int sidebar_left = panel_manager::get_manager().get_width_left();
2908 const int sidebar_right = panel_manager::get_manager().get_width_right();
2909
2911 TERRAIN_WINDOW_WIDTH = TERMX - ( sidebar_left + sidebar_right );
2914
2915 /**
2916 * In tiles mode w_terrain can have a different font (with a different
2917 * tile dimension) or can be drawn by cata_tiles which uses tiles that again
2918 * might have a different dimension then the normal font used everywhere else.
2919 *
2920 * TERRAIN_WINDOW_WIDTH/TERRAIN_WINDOW_HEIGHT defines how many squares can
2921 * be displayed in w_terrain (using it's specific tile dimension), not
2922 * including partially drawn squares at the right/bottom. You should
2923 * use it whenever you want to draw specific squares in that window or to
2924 * determine whether a specific square is draw on screen (or outside the screen
2925 * and needs scrolling).
2926 *
2927 * TERRAIN_WINDOW_TERM_WIDTH/TERRAIN_WINDOW_TERM_HEIGHT defines the size of
2928 * w_terrain in the standard font dimension (the font that everything else uses).
2929 * You usually don't have to use it, expect for positioning of windows,
2930 * because the window positions use the standard font dimension.
2931 *
2932 * The code here calculates size available for w_terrain, caps it at
2933 * max_view_size (the maximal view range than any character can have at
2934 * any time).
2935 * It is stored in TERRAIN_WINDOW_*.
2936 */
2938
2939 // Position of the player in the terrain window, it is always in the center
2942
2944 point( sidebar_left, 0 ) );
2945
2946 // minimap is always MINIMAP_WIDTH x MINIMAP_HEIGHT in size
2948
2949 // need to init in order to avoid crash. gets updated by the panel code.
2951
2952 ui.position_from_window( catacurses::stdscr );
2953 } );
2954 ui->mark_resize();
2955 }
2956 return ui;
2957}
catacurses::window w_pixel_minimap
Definition: game.h:991
catacurses::window w_minimap_ptr
Definition: game.h:1028
weak_ptr_fast< ui_adaptor > main_ui_adaptor
Definition: game.h:1074
catacurses::window w_minimap
Definition: game.h:990
catacurses::window w_terrain_ptr
Definition: game.h:1027
static panel_manager & get_manager()
Definition: panels.h:72
int get_width_right()
Definition: panels.cpp:2175
int get_width_left()
Definition: panels.cpp:2183
Adaptor between UI code and the UI management system.
Definition: ui_manager.h:65
static constexpr int MINIMAP_WIDTH
static constexpr int MINIMAP_HEIGHT
void to_map_font_dimension(int &, int &)
Definition: game_ui.cpp:20
std::shared_ptr< T > shared_ptr_fast
Definition: memory_fast.h:16
window stdscr
Definition: overmap_ui.h:17
int TERRAIN_WINDOW_TERM_WIDTH
Definition: output.cpp:53
int TERRAIN_WINDOW_TERM_HEIGHT
Definition: output.cpp:54
int POSX
Definition: output.cpp:49
int TERRAIN_WINDOW_WIDTH
Definition: output.cpp:51
int POSY
Definition: output.cpp:50
int TERRAIN_WINDOW_HEIGHT
Definition: output.cpp:52

References g, panel_manager::get_manager(), panel_manager::get_width_left(), panel_manager::get_width_right(), main_ui_adaptor, MINIMAP_HEIGHT, MINIMAP_WIDTH, catacurses::newwin(), point_zero, POSX, POSY, catacurses::stdscr, TERMX, TERMY, TERRAIN_WINDOW_HEIGHT, TERRAIN_WINDOW_TERM_HEIGHT, TERRAIN_WINDOW_TERM_WIDTH, TERRAIN_WINDOW_WIDTH, to_map_font_dimension(), w_minimap, w_minimap_ptr, w_pixel_minimap, w_terrain, and w_terrain_ptr.

◆ create_starting_npcs()

void game::create_starting_npcs ( )
private

Definition at line 877 of file game.cpp.

878{
879 if( !get_option<bool>( "STATIC_NPC" ) ||
880 get_option<std::string>( "STARTING_NPC" ) == "never" ) {
881 return; //Do not generate a starting npc.
882 }
883
884 //We don't want more than one starting npc per starting location
885 const int radius = 1;
886 if( !overmap_buffer.get_npcs_near_player( radius ).empty() ) {
887 return; //There is already an NPC in this starting location
888 }
889
890 shared_ptr_fast<npc> tmp = make_shared_fast<npc>();
891 tmp->normalize();
892 tmp->randomize( one_in( 2 ) ? NC_DOCTOR : NC_NONE );
893 tmp->spawn_at_precise( { get_levx(), get_levy() }, u.pos() - point_south_east );
895 tmp->form_opinion( u );
896 tmp->set_attitude( NPCATT_NULL );
897 //This sets the NPC mission. This NPC remains in the starting location.
898 tmp->mission = NPC_MISSION_SHELTER;
899 tmp->chatbin.first_topic = "TALK_SHELTER";
900 tmp->toggle_trait( trait_id( "NPC_STARTING_NPC" ) );
901 tmp->set_fac( faction_id( "no_faction" ) );
902 //One random starting NPC mission
903 tmp->add_new_mission( mission::reserve_random( ORIGIN_OPENER_NPC, tmp->global_omt_location(),
904 tmp->getID() ) );
905}
int get_levy() const
Definition: game.cpp:11831
int get_levx() const
The top left corner of the reality bubble (in submaps coordinates).
Definition: game.cpp:11826
static mission * reserve_random(mission_origin origin, const tripoint_abs_omt &p, const character_id &npc_id)
Definition: mission.cpp:200
std::vector< shared_ptr_fast< npc > > get_npcs_near_player(int radius)
Same as get_npcs_near(int,int,int,int) but uses player position as center.
void insert_npc(const shared_ptr_fast< npc > &who)
Adds the npc to an overmap ( based on the npcs current location ) and stores it there.
string_id< faction > faction_id
Definition: clzones.h:30
@ ORIGIN_OPENER_NPC
Definition: mission.h:45
@ NPCATT_NULL
Definition: npc.h:81
@ NPC_MISSION_SHELTER
Definition: npc.h:181
npc_class_id NC_NONE("NC_NONE")
npc_class_id NC_DOCTOR("NC_DOCTOR")
static constexpr point point_south_east
Definition: point.h:279
bool one_in(int chance)
Definition: rng.cpp:65

References get_levx(), get_levy(), overmapbuffer::get_npcs_near_player(), overmapbuffer::insert_npc(), NC_DOCTOR, NC_NONE, NPC_MISSION_SHELTER, NPCATT_NULL, one_in(), ORIGIN_OPENER_NPC, overmap_buffer, point_south_east, Character::pos(), mission::reserve_random(), trait_id, and u.

Referenced by start_game().

◆ critter_at() [1/2]

template<typename T >
T * game::critter_at ( const tripoint p,
bool  allow_hallucination = false 
)

Returns the Creature at the given location.

Optionally casted to the given type of creature: npc, player, monster - if there is a creature, but it's not of the requested type, returns nullptr.

Parameters
allow_hallucinationWhether to return monsters that are actually hallucinations.

Definition at line 4494 of file game.cpp.

4495{
4496 if( const shared_ptr_fast<monster> mon_ptr = critter_tracker->find( p ) ) {
4497 if( !allow_hallucination && mon_ptr->is_hallucination() ) {
4498 return nullptr;
4499 }
4500 // if we wanted to check for an NPC / player / avatar,
4501 // there is sometimes a monster AND an NPC/player there at the same time.
4502 // because the NPC/player etc may be riding that monster.
4503 // so only return the monster if we were actually looking for a monster.
4504 // otherwise, keep looking for the rider.
4505 // critter_at<creature> or critter_at() with no template will still default to returning monster first,
4506 // which is ok for the occasions where that happens.
4507 if( !mon_ptr->has_effect( effect_ridden ) || ( std::is_same<T, monster>::value ||
4508 std::is_same<T, Creature>::value || std::is_same<T, const monster>::value ||
4509 std::is_same<T, const Creature>::value ) ) {
4510 return dynamic_cast<T *>( mon_ptr.get() );
4511 }
4512 }
4513 if( !std::is_same<T, npc>::value && !std::is_same<T, const npc>::value ) {
4514 if( p == u.pos() ) {
4515 return dynamic_cast<T *>( &u );
4516 }
4517 }
4518 for( auto &cur_npc : active_npc ) {
4519 if( cur_npc->pos() == p && !cur_npc->is_dead() ) {
4520 return dynamic_cast<T *>( cur_npc.get() );
4521 }
4522 }
4523 return nullptr;
4524}
static const efftype_id effect_ridden("ridden")

References active_npc, critter_tracker, effect_ridden, Character::pos(), and u.

Referenced by draw_look_around_cursor(), examine(), find_or_make_stairs(), fling_creature(), forced_door_closing(), get_player_input(), is_empty(), knockback(), phasing_move(), print_all_tile_info(), spawn_hallucination(), swap_critters(), and update_stair_monsters().

◆ critter_at() [2/2]

template<typename T >
const T * game::critter_at ( const tripoint p,
bool  allow_hallucination = false 
) const

Definition at line 4527 of file game.cpp.

4528{
4529 return const_cast<game *>( this )->critter_at<T>( p, allow_hallucination );
4530}
Definition: game.h:144

◆ critter_by_id()

template<typename T >
template Creature * game::critter_by_id< Creature > ( const character_id id)
Returns
The living creature with the given id. Returns null if no living creature with such an id exists. Never returns a dead creature. Currently only the player character and npcs have ids.

Definition at line 4573 of file game.cpp.

4574{
4575 if( id == u.getID() ) {
4576 // player is always alive, therefore no is-dead check
4577 return dynamic_cast<T *>( &u );
4578 }
4579 return find_npc( id );
4580}
character_id getID() const
Definition: character.cpp:478
npc * find_npc(character_id id)
Find the npc with the given ID.
Definition: game.cpp:1866

References find_npc(), Character::getID(), and u.

◆ death_screen()

void game::death_screen ( )
private

Definition at line 2409 of file game.cpp.

2410{
2411 gamemode->game_over();
2416 follower_ids.clear();
2418}
diary * get_avatar_diary()
Definition: avatar.cpp:369
void death_entry()
Definition: diary.cpp:672
stats_tracker & stats()
Definition: game.cpp:2704
void disp_NPC_epilogues()
Definition: game.cpp:2783
void display_faction_epilogues()
Definition: game.cpp:2800
void display_messages()
Definition: messages.cpp:801
void show_scores_ui(const achievements_tracker &achievements, stats_tracker &stats, const kill_tracker &kills)
Definition: scores_ui.cpp:69

References achievements_tracker_ptr, diary::death_entry(), disp_NPC_epilogues(), display_faction_epilogues(), Messages::display_messages(), follower_ids, gamemode, avatar::get_avatar_diary(), get_kill_tracker(), show_scores_ui(), stats(), and u.

Referenced by cleanup_at_end().

◆ despawn_monster()

void game::despawn_monster ( monster critter)

Despawn a specific monster, it's stored on the overmap.

Also removes it from the creature tracker. Keep in mind that any monster index may point to a different monster after calling this (or to no monster at all).

Definition at line 10964 of file game.cpp.

10965{
10966 if( !critter.is_hallucination() ) {
10967 // hallucinations aren't stored, they come and go as they like,
10969 }
10970
10971 critter.on_unload();
10972 remove_zombie( critter );
10973 // simulate it being dead so further processing of it (e.g. in monmove) will yield
10974 critter.set_hp( 0 );
10975}
void remove_zombie(const monster &critter)
Definition: game.cpp:4684
bool is_hallucination() const override
Definition: monster.cpp:2672
void on_unload()
Do some cleanup and caching as monster is being unloaded from map.
Definition: monster.cpp:3005
void set_hp(int hp)
Directly set the current hp of the monster (not capped at the maximal hp).
Definition: monster.cpp:1655
void despawn_monster(const monster &critter)
Despawn the monster back onto the overmap.

References overmapbuffer::despawn_monster(), monster::is_hallucination(), monster::on_unload(), overmap_buffer, remove_zombie(), and monster::set_hp().

Referenced by cleanup_at_end(), monmove(), place_player_overmap(), and shift_monsters().

◆ disable_robot()

bool game::disable_robot ( const tripoint p)

If there is a robot (that can be disabled), query the player and try to disable it.

Returns
true if the robot has been disabled or a similar action has been done. false if the player did not choose any action and the function has effectively done nothing.

Definition at line 8586 of file game.cpp.

8587{
8588 monster *const mon_ptr = critter_at<monster>( p );
8589 if( !mon_ptr ) {
8590 return false;
8591 }
8592 monster &critter = *mon_ptr;
8593 if( critter.friendly == 0 || critter.has_effect( effect_pet ) ||
8594 critter.has_flag( MF_RIDEABLE_MECH ) ||
8595 ( critter.has_flag( MF_PAY_BOT ) && critter.has_effect( effect_paid ) ) ) {
8596 // Can only disable / reprogram friendly monsters
8597 return false;
8598 }
8599 const auto mid = critter.type->id;
8600 const auto mon_item_id = critter.type->revert_to_itype;
8601 if( !mon_item_id.is_empty() &&
8602 query_yn( _( "Deactivate the %s?" ), critter.name() ) ) {
8603
8604 u.moves -= 100;
8605 m.add_item_or_charges( p, critter.to_item() );
8606 if( !critter.has_flag( MF_INTERIOR_AMMO ) ) {
8607 for( auto &ammodef : critter.ammo ) {
8608 if( ammodef.second > 0 ) {
8609 m.spawn_item( p.xy(), ammodef.first, 1, ammodef.second, calendar::turn );
8610 }
8611 }
8612 }
8613 remove_zombie( critter );
8614 return true;
8615 }
8616 // Manhacks are special, they have their own menu here.
8617 if( mid == mon_manhack ) {
8618 int choice = UILIST_CANCEL;
8619 if( critter.has_effect( effect_docile ) ) {
8620 choice = uilist( _( "Reprogram the manhack?" ), { _( "Engage targets." ) } );
8621 } else {
8622 choice = uilist( _( "Reprogram the manhack?" ), { _( "Follow me." ) } );
8623 }
8624 switch( choice ) {
8625 case 0:
8626 if( critter.has_effect( effect_docile ) ) {
8627 critter.remove_effect( effect_docile );
8628 if( one_in( 3 ) ) {
8629 add_msg( _( "The %s hovers momentarily as it surveys the area." ),
8630 critter.name() );
8631 }
8632 } else {
8633 critter.add_effect( effect_docile, 1_turns, num_bp );
8634 if( one_in( 3 ) ) {
8635 add_msg( _( "The %s lets out a whirring noise and starts to follow you." ),
8636 critter.name() );
8637 }
8638 }
8639 u.moves -= 100;
8640 return true;
8641 default:
8642 break;
8643 }
8644 }
8645 return false;
8646}
@ num_bp
Definition: bodypart.h:52
bool remove_effect(const efftype_id &eff_id, body_part bp=num_bp)
Removes a listed effect.
Definition: creature.cpp:1141
void spawn_item(const tripoint &p, const itype_id &type_id, unsigned quantity=1, int charges=0, const time_point &birthday=calendar::start_of_cataclysm, int damlevel=0)
Definition: map.cpp:4194
bool has_flag(m_flag f) const override
Definition: monster.cpp:889
item to_item() const
Convert this monster into an item (see mtype::revert_to_itype).
Definition: monster.cpp:2812
void add_effect(const efftype_id &eff_id, const time_duration &dur, const bodypart_str_id &bp, int intensity=0, bool force=false, bool deferred=false) override
Performs any monster-specific modifications to the arguments before passing to Creature::add_effect()...
Definition: monster.cpp:1831
int friendly
Definition: monster.h:473
std::string name(unsigned int quantity=1) const
Definition: monster.cpp:493
std::map< itype_id, int > ammo
Definition: monster.h:514
static const efftype_id effect_pet("pet")
static const efftype_id effect_docile("docile")
static const efftype_id effect_paid("paid")
static const mtype_id mon_manhack("mon_manhack")
@ MF_INTERIOR_AMMO
Definition: mtype.h:146
@ MF_RIDEABLE_MECH
Definition: mtype.h:115
@ MF_PAY_BOT
Definition: mtype.h:121
itype_id revert_to_itype
If this is not empty, the monster can be converted into an item of this type (if it's friendly).
Definition: mtype.h:364
constexpr point xy() const
Definition: point.h:220
const int UILIST_CANCEL
Definition: ui.h:28

References _, monster::add_effect(), map::add_item_or_charges(), add_msg(), monster::ammo, effect_docile, effect_paid, effect_pet, monster::friendly, Creature::has_effect(), monster::has_flag(), mtype::id, m, MF_INTERIOR_AMMO, MF_PAY_BOT, MF_RIDEABLE_MECH, mon_manhack, Creature::moves, monster::name(), num_bp, one_in(), query_yn(), Creature::remove_effect(), remove_zombie(), mtype::revert_to_itype, map::spawn_item(), monster::to_item(), calendar::turn, monster::type, u, UILIST_CANCEL, and tripoint::xy().

Referenced by examine().

◆ disp_NPC_epilogues()

void game::disp_NPC_epilogues ( )
private

Definition at line 2783 of file game.cpp.

2784{
2785 // TODO: This search needs to be expanded to all NPCs
2786 for( auto elem : follower_ids ) {
2788 if( !guy ) {
2789 continue;
2790 }
2791 const auto new_win = []() {
2793 point( std::max( 0, ( TERMX - FULL_SCREEN_WIDTH ) / 2 ),
2794 std::max( 0, ( TERMY - FULL_SCREEN_HEIGHT ) / 2 ) ) );
2795 };
2796 scrollable_text( new_win, guy->disp_name(), guy->get_epilogue() );
2797 }
2798}
shared_ptr_fast< npc > find_npc(character_id id)
Find the npc with the given ID.
void scrollable_text(const std::function< catacurses::window()> &init_window, const std::string &title, const std::string &text)
Definition: output.cpp:352

References overmapbuffer::find_npc(), follower_ids, FULL_SCREEN_HEIGHT, FULL_SCREEN_WIDTH, catacurses::newwin(), overmap_buffer, scrollable_text(), TERMX, and TERMY.

Referenced by death_screen().

◆ disp_NPCs()

void game::disp_NPCs ( )

Definition at line 2834 of file game.cpp.

2835{
2836 const tripoint_abs_omt ppos = u.global_omt_location();
2837 const tripoint &lpos = u.pos();
2838 std::vector<shared_ptr_fast<npc>> npcs = overmap_buffer.get_npcs_near_player( 100 );
2839 std::sort( npcs.begin(), npcs.end(), npc_dist_to_player() );
2840
2842 ui_adaptor ui;
2843 ui.on_screen_resize( [&]( ui_adaptor & ui ) {
2846 TERMY > FULL_SCREEN_HEIGHT ? ( TERMY - FULL_SCREEN_HEIGHT ) / 2 : 0 ) );
2847 ui.position_from_window( w );
2848 } );
2849 ui.mark_resize();
2850 ui.on_redraw( [&]( const ui_adaptor & ) {
2851 werase( w );
2852 mvwprintz( w, point_zero, c_white, _( "Your overmap position: %s" ), ppos.to_string() );
2853 // NOLINTNEXTLINE(cata-use-named-point-constants)
2854 mvwprintz( w, point( 0, 1 ), c_white, _( "Your local position: %s" ), lpos.to_string() );
2855 size_t i;
2856 for( i = 0; i < 20 && i < npcs.size(); i++ ) {
2857 const tripoint_abs_omt apos = npcs[i]->global_omt_location();
2858 mvwprintz( w, point( 0, i + 3 ), c_white, "%s: %s", npcs[i]->name,
2859 apos.to_string() );
2860 }
2861 for( const monster &m : all_monsters() ) {
2862 mvwprintz( w, point( 0, i + 3 ), c_white, "%s: %d, %d, %d", m.name(),
2863 m.posx(), m.posy(), m.posz() );
2864 ++i;
2865 }
2866 wnoutrefresh( w );
2867 } );
2868
2869 input_context ctxt( "DISP_NPCS" );
2870 ctxt.register_action( "CONFIRM" );
2871 ctxt.register_action( "QUIT" );
2872 ctxt.register_action( "HELP_KEYBINDINGS" );
2873 bool stop = false;
2874 while( !stop ) {
2876 const std::string action = ctxt.handle_input();
2877 if( action == "CONFIRM" || action == "QUIT" ) {
2878 stop = true;
2879 }
2880 }
2881}
tripoint_abs_omt global_omt_location() const
Returns the location of the player in global overmap terrain coordinates.
Definition: character.cpp:6248
std::string to_string() const
Definition: coordinates.h:140
Represents a context in which a set of actions can be performed.
Definition: input.h:386
std::string name(const tripoint &p)
Definition: map.cpp:1325
void wnoutrefresh(const window &win)
Definition: ncurses_def.cpp:43
void werase(const window &win)
Definition: ncurses_def.cpp:53
std::string to_string() const
Definition: point.cpp:16

References _, action, all_monsters(), c_white, FULL_SCREEN_HEIGHT, FULL_SCREEN_WIDTH, overmapbuffer::get_npcs_near_player(), Character::global_omt_location(), input_context::handle_input(), m, mvwprintz(), map::name(), om_direction::name(), catacurses::newwin(), overmap_buffer, point_zero, Character::pos(), ui_manager::redraw(), input_context::register_action(), TERMX, TERMY, coords::coord_point< Point, Origin, Scale >::to_string(), tripoint::to_string(), u, catacurses::werase(), and catacurses::wnoutrefresh().

◆ display_faction_epilogues()

void game::display_faction_epilogues ( )
private

Definition at line 2800 of file game.cpp.

2801{
2802 for( const auto &elem : faction_manager_ptr->all() ) {
2803 if( elem.second.known_by_u ) {
2804 const std::vector<std::string> epilogue = elem.second.epilogue();
2805 if( !epilogue.empty() ) {
2806 const auto new_win = []() {
2808 point( std::max( 0, ( TERMX - FULL_SCREEN_WIDTH ) / 2 ),
2809 std::max( 0, ( TERMY - FULL_SCREEN_HEIGHT ) / 2 ) ) );
2810 };
2811 scrollable_text( new_win, elem.second.name,
2812 std::accumulate( epilogue.begin() + 1, epilogue.end(), epilogue.front(),
2813 []( const std::string & lhs, const std::string & rhs ) -> std::string {
2814 return lhs + "\n" + rhs;
2815 } ) );
2816 }
2817 }
2818 }
2819}
pimpl< faction_manager > faction_manager_ptr
Definition: game.h:974

References faction_manager_ptr, FULL_SCREEN_HEIGHT, FULL_SCREEN_WIDTH, catacurses::newwin(), scrollable_text(), TERMX, and TERMY.

Referenced by death_screen().

◆ display_lighting()

void game::display_lighting ( )
private

Definition at line 11176 of file game.cpp.

11177{
11178 if( use_tiles ) {
11180 if( !g->display_overlay_state( ACTION_DISPLAY_LIGHTING ) ) {
11181 return;
11182 }
11183 uilist lighting_menu;
11184 std::vector<std::string> lighting_menu_strings{
11185 "Global lighting conditions"
11186 };
11187
11188 int count = 0;
11189 for( const auto &menu_str : lighting_menu_strings ) {
11190 lighting_menu.addentry( count++, true, MENU_AUTOASSIGN, "%s", menu_str );
11191 }
11192
11193 lighting_menu.w_y_setup = 0;
11194 lighting_menu.query();
11195 if( ( lighting_menu.ret >= 0 ) &&
11196 ( static_cast<size_t>( lighting_menu.ret ) < lighting_menu_strings.size() ) ) {
11197 g->displaying_lighting_condition = lighting_menu.ret;
11198 }
11199 }
11200}
@ ACTION_DISPLAY_LIGHTING
Toggle lighting conditions map.
Definition: action.h:321
bool use_tiles
Use tiles for display.
void display_toggle_overlay(action_id)
Definition: game.cpp:11072
pos_scalar w_y_setup
Definition: ui.h:338
constexpr size_t count()
Definition: fmtlib_core.h:1073
const int MENU_AUTOASSIGN
Definition: ui.h:31

References ACTION_DISPLAY_LIGHTING, uilist::addentry(), detail::count(), display_toggle_overlay(), g, MENU_AUTOASSIGN, uilist::query(), uilist::ret, use_tiles, and uilist::w_y_setup.

Referenced by handle_action(), and look_around().

◆ display_overlay_state()

bool game::display_overlay_state ( action_id  action)

Definition at line 11067 of file game.cpp.

11068{
11070}
cata::optional< action_id > displaying_overlays
Definition: game.h:919

References action, and displaying_overlays.

Referenced by display_toggle_overlay(), and display_visibility().

◆ display_radiation()

void game::display_radiation ( )
private

Definition at line 11202 of file game.cpp.

11203{
11204 if( use_tiles ) {
11206 }
11207}
@ ACTION_DISPLAY_RADIATION
Toggle radiation map.
Definition: action.h:323

References ACTION_DISPLAY_RADIATION, display_toggle_overlay(), and use_tiles.

Referenced by handle_action(), and look_around().

◆ display_scent()

void game::display_scent ( )
private

Definition at line 11081 of file game.cpp.

11082{
11083 if( use_tiles ) {
11085 } else {
11086 int div;
11087 bool got_value = query_int( div, _( "Set the Scent Map sensitivity to (0 to cancel)?" ) );
11088 if( !got_value || div < 1 ) {
11089 add_msg( _( "Never mind." ) );
11090 return;
11091 }
11092 shared_ptr_fast<game::draw_callback_t> scent_cb = make_shared_fast<game::draw_callback_t>( [&]() {
11093 scent.draw( w_terrain, div * 2, u.pos() + u.view_offset );
11094 } );
11095 g->add_draw_callback( scent_cb );
11096
11099 }
11100}
@ ACTION_DISPLAY_SCENT
Toggle scent map.
Definition: action.h:283
void wait_for_any_key()
Wait until the user presses a key.
Definition: input.cpp:1309
tripoint view_offset
Definition: player.h:463
void draw(const catacurses::window &win, int div, const tripoint &center) const
Definition: scent_map.cpp:70
input_manager inp_mngr
Definition: input.cpp:109
bool query_int(int &result, int default_val, const std::string &text)
Definition: output.cpp:718

References _, ACTION_DISPLAY_SCENT, add_msg(), display_toggle_overlay(), scent_map::draw(), g, inp_mngr, Character::pos(), query_int(), ui_manager::redraw(), scent, u, use_tiles, player::view_offset, w_terrain, and input_manager::wait_for_any_key().

Referenced by handle_action(), and look_around().

◆ display_temperature()

void game::display_temperature ( )
private

Definition at line 11102 of file game.cpp.

11103{
11104 if( use_tiles ) {
11106 }
11107}
@ ACTION_DISPLAY_TEMPERATURE
Toggle temperature map.
Definition: action.h:315

References ACTION_DISPLAY_TEMPERATURE, display_toggle_overlay(), and use_tiles.

Referenced by handle_action(), and look_around().

◆ display_toggle_overlay()

void game::display_toggle_overlay ( action_id  action)

Definition at line 11072 of file game.cpp.

11073{
11074 if( display_overlay_state( action ) ) {
11075 displaying_overlays.reset();
11076 } else {
11078 }
11079}
bool display_overlay_state(action_id)
Definition: game.cpp:11067

References action, display_overlay_state(), and displaying_overlays.

Referenced by display_lighting(), display_radiation(), display_scent(), display_temperature(), display_transparency(), display_vehicle_ai(), and display_visibility().

◆ display_transparency()

void game::display_transparency ( )
private

Definition at line 11209 of file game.cpp.

11210{
11211 if( use_tiles ) {
11213 }
11214}
@ ACTION_DISPLAY_TRANSPARENCY
Toggle transparency map.
Definition: action.h:325

References ACTION_DISPLAY_TRANSPARENCY, display_toggle_overlay(), and use_tiles.

Referenced by handle_action(), and look_around().

◆ display_vehicle_ai()

void game::display_vehicle_ai ( )
private

Definition at line 11109 of file game.cpp.

11110{
11111 if( use_tiles ) {
11113 }
11114}
@ ACTION_DISPLAY_VEHICLE_AI
Toggle vehicle autopilot data.
Definition: action.h:317

References ACTION_DISPLAY_VEHICLE_AI, display_toggle_overlay(), and use_tiles.

Referenced by handle_action().

◆ display_visibility()

void game::display_visibility ( )
private

Definition at line 11116 of file game.cpp.

11117{
11118 if( use_tiles ) {
11121 std::vector< tripoint > locations;
11122 uilist creature_menu;
11123 int num_creatures = 0;
11124 creature_menu.addentry( num_creatures++, true, MENU_AUTOASSIGN, "%s", _( "You" ) );
11125 locations.emplace_back( g->u.pos() ); // add player first.
11126 for( const Creature &critter : g->all_creatures() ) {
11127 if( critter.is_player() ) {
11128 continue;
11129 }
11130 creature_menu.addentry( num_creatures++, true, MENU_AUTOASSIGN, critter.disp_name() );
11131 locations.emplace_back( critter.pos() );
11132 }
11133
11134 pointmenu_cb callback( locations );
11135 creature_menu.callback = &callback;
11136 creature_menu.w_y_setup = 0;
11137 creature_menu.query();
11138 if( creature_menu.ret >= 0 && static_cast<size_t>( creature_menu.ret ) < locations.size() ) {
11139 Creature *creature = critter_at<Creature>( locations[creature_menu.ret] );
11141 }
11142 } else {
11144 }
11145 }
11146}
@ ACTION_DISPLAY_VISIBILITY
Toggle visibility map.
Definition: action.h:319
size_t num_creatures() const
Returns the approximate number of creatures in the reality bubble.
Definition: game.cpp:4674
Creature * displaying_visibility_creature
Creature for which to display the visibility map.
Definition: game.h:1010
Callback for uilist that pairs menu entries with points When an entry is selected,...
Definition: ui.h:423
uilist_callback * callback
Definition: ui.h:335
generic_factory< overmap_location > locations("overmap location")

References _, ACTION_DISPLAY_VISIBILITY, uilist::addentry(), uilist::callback, creature, display_overlay_state(), display_toggle_overlay(), displaying_visibility_creature, g, anonymous_namespace{overmap_location.cpp}::locations, MENU_AUTOASSIGN, num_creatures(), uilist::query(), uilist::ret, use_tiles, and uilist::w_y_setup.

Referenced by handle_action().

◆ do_turn()

bool game::do_turn ( )

MAIN GAME LOOP.

Returns true if game is over (death, saved, quit, etc.).

Definition at line 1340 of file game.cpp.

1341{
1342 if( is_game_over() ) {
1343 return cleanup_at_end();
1344 }
1345 // Actual stuff
1346 if( new_game ) {
1347 new_game = false;
1348 } else {
1349 gamemode->per_turn();
1350 calendar::turn += 1_turns;
1351 }
1352
1353 // starting a new turn, clear out temperature cache
1355 weather.clear_temp_cache();
1356
1357 if( npcs_dirty ) {
1358 load_npcs();
1359 }
1360
1363 // If controlling a vehicle that is owned by someone else
1365 vehicle *veh = veh_pointer_or_null( m.veh_at( u.pos() ) );
1366 if( veh && !veh->handle_potential_theft( dynamic_cast<player &>( u ), true ) ) {
1367 veh->handle_potential_theft( dynamic_cast<player &>( u ), false, false );
1368 }
1369 }
1370 // If riding a horse - chance to spook
1371 if( u.is_mounted() ) {
1373 }
1374 if( calendar::once_every( 1_days ) ) {
1376 }
1377
1378 // Move hordes every 2.5 min
1381 // Hordes that reached the reality bubble need to spawn,
1382 // make them spawn in invisible areas only.
1383 m.spawn_monsters( false );
1384 }
1385
1387
1388 u.update_body();
1389
1390 // Auto-save if autosave is enabled
1391 if( get_option<bool>( "AUTOSAVE" ) &&
1392 calendar::once_every( 1_turns * get_option<int>( "AUTOSAVE_TURNS" ) ) &&
1393 !u.is_dead_state() ) {
1394 autosave();
1395 }
1396
1397 weather.update_weather();
1399
1403 // Process NPC sound events before they move or they hear themselves talking
1404 for( npc &guy : all_npcs() ) {
1405 if( rl_dist( guy.pos(), u.pos() ) < MAX_VIEW_DISTANCE ) {
1407 }
1408 }
1409
1410 // Process sound events into sound markers for display to the player.
1412
1413 if( u.is_deaf() ) {
1415 }
1416
1417 if( !u.has_effect( effect_sleep ) || uquit == QUIT_WATCH ) {
1418 if( u.moves > 0 || uquit == QUIT_WATCH ) {
1419 while( u.moves > 0 || uquit == QUIT_WATCH ) {
1420 cleanup_dead();
1422 // Process any new sounds the player caused during their turn.
1423 for( npc &guy : all_npcs() ) {
1424 if( rl_dist( guy.pos(), u.pos() ) < MAX_VIEW_DISTANCE ) {
1426 }
1427 }
1430 wait_popup.reset();
1432 }
1433
1434 if( queue_screenshot ) {
1438 queue_screenshot = false;
1439 }
1440
1441 if( handle_action() ) {
1443 u.action_taken();
1444 }
1445
1446 if( is_game_over() ) {
1447 return cleanup_at_end();
1448 }
1449
1450 if( uquit == QUIT_WATCH ) {
1451 break;
1452 }
1453 if( u.activity ) {
1455 }
1456 }
1457 // Reset displayed sound markers now that the turn is over.
1458 // We only want this to happen if the player had a chance to examine the sounds.
1460 }
1461 }
1462
1463 if( driving_view_offset.x != 0 || driving_view_offset.y != 0 ) {
1464 // Still have a view offset, but might not be driving anymore,
1465 // or the option has been deactivated,
1466 // might also happen when someone dives from a moving car.
1467 // or when using the handbrake.
1468 vehicle *veh = veh_pointer_or_null( m.veh_at( u.pos() ) );
1469 calc_driving_offset( veh );
1470 }
1471
1472 // No-scent debug mutation has to be processed here or else it takes time to start working
1473 if( !u.has_active_bionic( bionic_id( "bio_scent_mask" ) ) &&
1474 !u.has_trait( trait_id( "DEBUG_NOSCENT" ) ) ) {
1477 }
1478 scent.update( u.pos(), m );
1479
1480 // We need floor cache before checking falling 'n stuff
1482
1485 m.vehmove();
1486 m.process_fields();
1487 m.process_items();
1490
1491 // Apply sounds from previous turn to monster and NPC AI.
1493 // Update vision caches for monsters. If this turns out to be expensive,
1494 // consider a stripped down cache just for monsters.
1495 m.build_map_cache( get_levz(), true );
1496 monmove();
1497 if( calendar::once_every( 5_minutes ) ) {
1499 }
1500 if( calendar::once_every( 10_seconds ) ) {
1501 for( const tripoint &elem : m.get_furn_field_locations() ) {
1502 const auto &furn = m.furn( elem ).obj();
1503 for( const emit_id &e : furn.emissions ) {
1504 m.emit_field( elem, e );
1505 }
1506 }
1507 }
1510 u.process_turn();
1511
1513 cleanup_dead();
1514
1515 if( u.moves < 0 && get_option<bool>( "FORCE_REDRAW" ) ) {
1518 }
1519
1520 if( get_levz() >= 0 && !u.is_underwater() ) {
1521 handle_weather_effects( weather.weather_id );
1522 }
1523
1524 const bool player_is_sleeping = u.has_effect( effect_sleep );
1525 bool wait_redraw = false;
1526 std::string wait_message;
1527 time_duration wait_refresh_rate;
1528 if( player_is_sleeping ) {
1529 wait_redraw = true;
1530 wait_message = _( "Wait till you wake up…" );
1531 wait_refresh_rate = 30_minutes;
1532 if( calendar::once_every( 1_hours ) ) {
1534 }
1535 } else if( u.has_destination() ) {
1536 wait_redraw = true;
1537 wait_message = _( "Travelling…" );
1538 wait_refresh_rate = 15_turns;
1539 } else if( const cata::optional<std::string> progress = u.activity.get_progress_message( u ) ) {
1540 wait_redraw = true;
1541 wait_message = *progress;
1542 if( u.activity.id() == ACT_AUTODRIVE ) {
1543 wait_refresh_rate = 1_turns;
1544 } else {
1545 wait_refresh_rate = 5_minutes;
1546 }
1547 }
1548 if( wait_redraw ) {
1550 calendar::once_every( std::min( 1_minutes, wait_refresh_rate ) ) ) {
1551 if( first_redraw_since_waiting_started || calendar::once_every( wait_refresh_rate ) ) {
1553 }
1554
1555 // Avoid redrawing the main UI every time due to invalidation
1557 wait_popup = std::make_unique<static_popup>();
1558 wait_popup->on_top( true ).wait_message( "%s", wait_message );
1562 }
1563 } else {
1564 // Nothing to wait for now
1565 wait_popup.reset();
1567 }
1568
1571 u.apply_wetness_morale( weather.temperature );
1572
1573 if( calendar::once_every( 1_minutes ) ) {
1574 u.update_morale();
1575 }
1576
1577 if( calendar::once_every( 9_turns ) ) {
1579 }
1580
1581 if( !u.is_deaf() ) {
1583 }
1588
1589 // reset player noise
1590 u.volume = 0;
1591
1592 return false;
1593}
void update_morale()
Ticks down morale counters and removes them.
Definition: character.cpp:8910
void action_taken()
Called after every action, invalidates player caches.
Definition: character.cpp:932
bool check_mount_is_spooked()
Definition: character.cpp:1157
void process_turn() override
Handles end-of-turn processing.
void update_bodytemp(const map &m, const weather_manager &weather)
Maintains body temperature.
Definition: character.cpp:5196
bool is_mounted() const
Definition: character.cpp:1198
bool has_destination() const
scenttype_id get_type_of_scent() const
Definition: character.cpp:8669
bool is_dead_state() const override
Returns true if the character should be dead.
Definition: character.cpp:483
bool check_and_recover_morale()
Checks permanent morale for consistency and recovers it when an inconsistency is found.
Definition: character.cpp:9037
bool is_deaf() const
Definition: character.cpp:4498
void update_body()
Updates all "biology" by one turn.
Definition: character.cpp:4677
bool has_active_bionic(const bionic_id &b) const
Returns true if the player has the entered bionic id and it is powered on.
Definition: character.cpp:1939
void apply_wetness_morale(int temperature)
Recalculates morale penalty/bonus from wetness based on mutations, equipment and temperature.
Definition: suffer.cpp:1807
virtual bool is_underwater() const
Definition: creature.cpp:174
int get_levz() const
Definition: game.cpp:11836
void overmap_npc_move()
Definition: game.cpp:4173
class game::debug_hour_timer debug_hour_timer
npc_range all_npcs()
Same as all_creatures but iterators only over npcs.
Definition: game.cpp:11946
void monmove()
Definition: game.cpp:4048
void autopilot_vehicles()
process vehicles that are following the player
Definition: game.cpp:1658
void add_artifact_dreams()
Definition: game.cpp:11778
int moves_since_last_save
Definition: game.h:1040
bool take_screenshot() const
Saves a screenshot of the current viewport, as a PNG file.
Definition: game.cpp:7109
void calc_driving_offset(vehicle *veh=nullptr)
Definition: game.cpp:1238
bool cleanup_at_end()
Definition: game.cpp:934
std::unique_ptr< static_popup > wait_popup
Definition: game.h:1076
bool queue_screenshot
Definition: game.h:1019
friend weather_manager & get_weather()
Definition: weather.cpp:64
void autosave()
Definition: game.cpp:11267
void process_activity()
Definition: game.cpp:1647
void update_stair_monsters()
Definition: game.cpp:10755
void process_voluntary_act_interrupt()
Definition: game.cpp:1607
void load_npcs()
Makes any nearby NPCs on the overmap active.
Definition: game.cpp:802
bool npcs_dirty
Has a NPC been spawned since last load?
Definition: game.h:1047
void cleanup_dead()
Definition: game.cpp:4013
bool is_game_over()
Definition: game.cpp:2362
void perhaps_add_random_npc()
Definition: game.cpp:11002
void mon_info_update()
Definition: game.cpp:3812
bool handle_action()
const T & obj() const
Definition: ammo_effect.cpp:26
void build_floor_caches()
Definition: map.cpp:8064
void process_falling()
Invoked drop_everything on cached dirty tiles.
Definition: map.cpp:2274
void emit_field(const tripoint &pos, const emit_id &src, float mul=1.0f)
Runs one cycle of emission src which may result in propagation of fields.
Definition: map_field.cpp:1928
const std::vector< tripoint > & get_furn_field_locations() const
Definition: map.cpp:7761
void spawn_monsters(bool ignore_sight)
Spawn monsters from submap spawn points and from the overmap.
Definition: map.cpp:7720
void vehmove()
Definition: map.cpp:414
void creature_in_field(Creature &critter)
Apply field effects to the creature when it's on a square with fields.
Definition: map_field.cpp:1563
void process_fields()
Definition: map_field.cpp:141
furn_id furn(const tripoint &p) const
Definition: map.cpp:1348
void build_map_cache(int zlev, bool skip_lightmap=false)
Definition: map.cpp:8230
void process_items()
Definition: map.cpp:4580
static void process_all()
Handles mission deadline processing.
Definition: mission.cpp:98
void set_scent(const tripoint_abs_omt &loc, int strength)
Method to set a scent trace.
void process_mongroups()
Process nearby monstergroups (dying mostly).
void move_hordes()
Let hordes move a step.
const activity_id & id() const
cata::optional< std::string > get_progress_message(const avatar &u) const
Helper that returns an activity specific progress message.
int volume
Definition: player.h:466
int scent
Definition: player.h:475
void set(const tripoint &p, int value, const scenttype_id &type=scenttype_id())
Get the scent value at the given position.
Definition: scent_map.cpp:102
void update(const tripoint &center, map &m)
Definition: scent_map.cpp:150
static constexpr time_duration from_minutes(const T m)
Definition: calendar.h:212
void process()
Process all queued events, potentially altering the game state and modifying the event queue.
static const activity_id ACT_AUTODRIVE("ACT_AUTODRIVE")
static const efftype_id effect_sleep("sleep")
@ QUIT_WATCH
Definition: game.h:73
static constexpr int MAX_VIEW_DISTANCE
void handle_weather_effects(const weather_type_id &w)
Definition: weather.cpp:522
bool once_every(const time_duration &event_frequency)
Predicate to handle rate-limiting.
Definition: calendar.cpp:490
void update_body_wetness(Character &who, const w_point &weather)
Maintains body wetness and handles the rate at which the player dries.
explosion_queue & get_explosion_queue()
Definition: explosion.cpp:1261
void do_vehicle_engine_sfx()
Definition: sounds.cpp:1614
void do_hearing_loss(int turns=-1)
Definition: sounds.cpp:1609
void do_danger_music()
Definition: sounds.cpp:1613
void do_vehicle_exterior_engine_sfx()
Definition: sounds.cpp:1615
void do_fatigue()
Definition: sounds.cpp:1634
void remove_hearing_loss()
Definition: sounds.cpp:1610
void process_sound_markers(player *p)
Definition: sounds.cpp:386
void process_sounds()
Definition: sounds.cpp:304
void reset_markers()
Definition: sounds.cpp:572
vehicle * veh_pointer_or_null(const optional_vpart_position &p)

References _, ACT_AUTODRIVE, Character::action_taken(), Character::activity, add_artifact_dreams(), all_npcs(), Character::apply_wetness_morale(), autopilot_vehicles(), autosave(), map::build_floor_caches(), map::build_map_cache(), calc_driving_offset(), Character::check_and_recover_morale(), Character::check_mount_is_spooked(), cleanup_at_end(), cleanup_dead(), Character::controlling_vehicle, map::creature_in_field(), sfx::do_danger_music(), sfx::do_fatigue(), sfx::do_hearing_loss(), sfx::do_vehicle_engine_sfx(), sfx::do_vehicle_exterior_engine_sfx(), driving_view_offset, effect_sleep, map::emit_field(), explosion_handler::explosion_queue::execute(), first_redraw_since_waiting_started, time_duration::from_minutes(), map::furn(), gamemode, explosion_handler::get_explosion_queue(), map::get_furn_field_locations(), get_levz(), player_activity::get_progress_message(), Character::get_type_of_scent(), get_weather, Character::global_omt_location(), grid_tracker_ptr, handle_action(), vehicle::handle_potential_theft(), handle_weather_effects(), Character::has_active_bionic(), Character::has_destination(), Character::has_distant_destination(), Creature::has_effect(), Character::has_trait(), player_activity::id(), Character::in_vehicle, invalidate_main_ui_adaptor(), Character::is_dead_state(), Character::is_deaf(), is_game_over(), Character::is_mounted(), Creature::is_underwater(), load_npcs(), m, MAX_VIEW_DISTANCE, mon_info_update(), monmove(), overmapbuffer::move_hordes(), Creature::moves, moves_since_last_save, new_game, npcs_dirty, int_id< T >::obj(), calendar::once_every(), overmap_buffer, overmap_npc_move(), perhaps_add_random_npc(), Character::pos(), game::debug_hour_timer::print_time(), timed_event_manager::process(), process_activity(), mission::process_all(), map::process_falling(), map::process_fields(), map::process_items(), overmapbuffer::process_mongroups(), sounds::process_sound_markers(), sounds::process_sounds(), Character::process_turn(), process_voluntary_act_interrupt(), queue_screenshot, QUIT_WATCH, ui_manager::redraw(), refresh_display(), sfx::remove_hearing_loss(), reset_light_level(), sounds::reset_markers(), rl_dist(), scent, player::scent, scent_map::set(), overmapbuffer::set_scent(), map::spawn_monsters(), take_screenshot(), timed_events, calendar::turn, u, scent_map::update(), Character::update_body(), character_funcs::update_body_wetness(), Character::update_bodytemp(), Character::update_morale(), update_stair_monsters(), uquit, map::veh_at(), veh_pointer_or_null(), map::vehmove(), player::volume, wait_popup, point::x, and point::y.

◆ draw()

void game::draw ( )

Definition at line 3071 of file game.cpp.

3072{
3073 if( test_mode ) {
3074 return;
3075 }
3076
3077 //temporary fix for updating visibility for minimap
3078 ter_view_p.z = ( u.pos() + u.view_offset ).z;
3081
3082 werase( w_terrain );
3083 draw_ter();
3084 for( auto it = draw_callbacks.begin(); it != draw_callbacks.end(); ) {
3085 shared_ptr_fast<draw_callback_t> cb = it->lock();
3086 if( cb ) {
3087 ( *cb )();
3088 ++it;
3089 } else {
3090 it = draw_callbacks.erase( it );
3091 }
3092 }
3094
3095 draw_panels( true );
3096}
bool test_mode
Set to true when running in test mode (e.g.
tripoint ter_view_p
Definition: game.h:986
void draw_panels(bool force_draw=false)
Definition: game.cpp:3098
void draw_ter(bool draw_sounds=true)
Definition: game.cpp:3212
void update_visibility_cache(int zlev)
Definition: map.cpp:5610
int z
Definition: point.h:152

References map::build_map_cache(), draw_callbacks, draw_panels(), draw_ter(), m, Character::pos(), ter_view_p, test_mode, u, map::update_visibility_cache(), player::view_offset, w_terrain, catacurses::werase(), catacurses::wnoutrefresh(), and tripoint::z.

◆ draw_below_override()

void game::draw_below_override ( const tripoint p,
bool  draw 
)

Definition at line 963 of file animation.cpp.

964{
965}

◆ draw_bullet()

void game::draw_bullet ( const tripoint t,
int  i,
const std::vector< tripoint > &  trajectory,
char  bullet 
)

Definition at line 518 of file animation.cpp.

520{
521 draw_bullet_curses( m, t, bullet, &trajectory[i] );
522}
void draw_bullet_curses(map &m, const tripoint &t, const char bullet, const tripoint *const p)
Definition: animation.cpp:459
std::vector< tripoint > trajectory
Definition: ranged.h:32

References anonymous_namespace{animation.cpp}::draw_bullet_curses(), and m.

◆ draw_critter()

void game::draw_critter ( const Creature critter,
const tripoint center 
)

Definition at line 3194 of file game.cpp.

3195{
3196 draw_critter_internal( w_terrain, critter, center, false, m, u );
3197}
static void draw_critter_internal(const catacurses::window &w, const Creature &critter, const tripoint &center, bool inverted, const map &m, const avatar &u)
Definition: game.cpp:3161

References center, draw_critter_internal(), m, u, and w_terrain.

Referenced by draw_ter().

◆ draw_critter_highlighted()

void game::draw_critter_highlighted ( const Creature critter,
const tripoint center 
)

Definition at line 3199 of file game.cpp.

3200{
3201 draw_critter_internal( w_terrain, critter, center, true, m, u );
3202}

References center, draw_critter_internal(), m, u, and w_terrain.

◆ draw_cursor()

void game::draw_cursor ( const tripoint p)

Definition at line 724 of file animation.cpp.

725{
726 const tripoint rp = relative_view_pos( *this, p );
727 mvwputch_inv( w_terrain, rp.xy(), c_light_green, 'X' );
728}
#define c_light_green
Definition: color.h:28
tripoint relative_view_pos(const game &g, const tripoint &p) noexcept
Definition: animation.cpp:127
void mvwputch_inv(const catacurses::window &w, const point &p, nc_color FG, int ch)
Definition: output.cpp:491

References c_light_green, mvwputch_inv(), anonymous_namespace{animation.cpp}::relative_view_pos(), w_terrain, and tripoint::xy().

Referenced by draw_look_around_cursor().

◆ draw_field_override()

void game::draw_field_override ( const tripoint p,
const field_type_id id 
)

Definition at line 919 of file animation.cpp.

920{
921}

◆ draw_furniture_override()

void game::draw_furniture_override ( const tripoint p,
const furn_id id 
)

Definition at line 880 of file animation.cpp.

881{
882}

◆ draw_graffiti_override()

void game::draw_graffiti_override ( const tripoint p,
bool  has 
)

Definition at line 893 of file animation.cpp.

894{
895}

◆ draw_highlight()

void game::draw_highlight ( const tripoint p)

Definition at line 737 of file animation.cpp.

738{
739 // Do nothing
740}

◆ draw_hit_mon()

void game::draw_hit_mon ( const tripoint p,
const monster m,
bool  dead = false 
)

Definition at line 581 of file animation.cpp.

582{
583 draw_hit_mon_curses( p, m, u, dead );
584}
void draw_hit_mon_curses(const tripoint &center, const monster &m, const player &u, const bool dead)
Definition: animation.cpp:552

References dead, anonymous_namespace{animation.cpp}::draw_hit_mon_curses(), m, and u.

◆ draw_hit_player()

void game::draw_hit_player ( const Character p,
int  dam 
)

Definition at line 626 of file animation.cpp.

627{
628 draw_hit_player_curses( *this, p, dam );
629}
void draw_hit_player_curses(const game &g, const Character &p, const int dam)
Definition: animation.cpp:589

References anonymous_namespace{animation.cpp}::draw_hit_player_curses().

◆ draw_item_override()

void game::draw_item_override ( const tripoint p,
const itype_id id,
const mtype_id mid,
bool  hilite 
)

Definition at line 933 of file animation.cpp.

935{
936}

◆ draw_line() [1/2]

void game::draw_line ( const tripoint p,
const std::vector< tripoint > &  points 
)

Definition at line 710 of file animation.cpp.

711{
712 draw_line_curses( *this, points );
713}
void draw_line_curses(game &g, const std::vector< tripoint > &points)
Definition: animation.cpp:690

References anonymous_namespace{animation.cpp}::draw_line_curses().

◆ draw_line() [2/2]

void game::draw_line ( const tripoint p,
const tripoint center_point,
const std::vector< tripoint > &  points,
bool  noreveal = false 
)

Definition at line 677 of file animation.cpp.

679{
680 if( !u.sees( p ) ) {
681 return;
682 }
683
684 draw_line_curses( *this, center, points, noreveal );
685}

References center, anonymous_namespace{animation.cpp}::draw_line_curses(), Character::sees(), and u.

Referenced by draw_ter().

◆ draw_look_around_cursor()

void game::draw_look_around_cursor ( const tripoint lp,
const visibility_variables cache 
)

Definition at line 5644 of file game.cpp.

5645{
5646 if( !liveview.is_enabled() ) {
5647#if defined( TILES )
5648 if( is_draw_tiles_mode() ) {
5649 draw_cursor( lp );
5650 return;
5651 }
5652#endif
5653 const tripoint view_center = u.pos() + u.view_offset;
5654 visibility_type visibility = VIS_HIDDEN;
5655 const bool inbounds = m.inbounds( lp );
5656 if( inbounds ) {
5657 visibility = m.get_visibility( m.apparent_light_at( lp, cache ), cache );
5658 }
5659 if( visibility == VIS_CLEAR ) {
5660 const Creature *const creature = critter_at( lp, true );
5661 if( creature != nullptr && u.sees( *creature ) ) {
5662 creature->draw( w_terrain, view_center, true );
5663 } else {
5664 m.drawsq( w_terrain, lp, drawsq_params().highlight( true ).center( view_center ) );
5665 }
5666 } else {
5667 std::string visibility_indicator;
5668 nc_color visibility_indicator_color = c_white;
5669 switch( visibility ) {
5670 case VIS_CLEAR:
5671 // Already handled by the outer if statement
5672 break;
5673 case VIS_BOOMER:
5674 case VIS_BOOMER_DARK:
5675 visibility_indicator = '#';
5676 visibility_indicator_color = c_pink;
5677 break;
5678 case VIS_DARK:
5679 visibility_indicator = '#';
5680 visibility_indicator_color = c_dark_gray;
5681 break;
5682 case VIS_LIT:
5683 visibility_indicator = '#';
5684 visibility_indicator_color = c_light_gray;
5685 break;
5686 case VIS_HIDDEN:
5687 visibility_indicator = 'x';
5688 visibility_indicator_color = c_white;
5689 break;
5690 }
5691
5692 const tripoint screen_pos = point( POSX, POSY ) + lp - view_center;
5693 mvwputch( w_terrain, screen_pos.xy(), visibility_indicator_color, visibility_indicator );
5694 }
5695 }
5696}
void draw_cursor(const tripoint &p)
Definition: animation.cpp:724
T * critter_at(const tripoint &p, bool allow_hallucination=false)
Returns the Creature at the given location.
Definition: game.cpp:4494
bool is_enabled()
Definition: live_view.cpp:75
virtual bool inbounds(const tripoint &p) const
Definition: map.cpp:7771
visibility_type get_visibility(lit_level ll, const visibility_variables &cache) const
Definition: map.cpp:5664
lit_level apparent_light_at(const tripoint &p, const visibility_variables &cache) const
Determine the visible light level for a tile, based on light_at for the tile, vision distance,...
Definition: lightmap.cpp:729
void drawsq(const catacurses::window &w, const tripoint &p, const drawsq_params &params) const
Draw the map tile at the given coordinate.
Definition: map.cpp:5842
#define c_dark_gray
Definition: color.h:20
#define c_pink
Definition: color.h:31
visibility_type
Definition: enums.h:57
@ VIS_CLEAR
Definition: enums.h:59
@ VIS_BOOMER
Definition: enums.h:61
@ VIS_DARK
Definition: enums.h:62
@ VIS_BOOMER_DARK
Definition: enums.h:63
@ VIS_HIDDEN
Definition: enums.h:58
@ VIS_LIT
Definition: enums.h:60
bool is_draw_tiles_mode()
Check whether we're in tile drawing mode.
Definition: output.cpp:2029
Draw parameters used by map::drawsq() and similar methods.
Definition: map.h:180

References map::apparent_light_at(), c_dark_gray, c_light_gray, c_pink, c_white, center, creature, critter_at(), draw_cursor(), map::drawsq(), map::get_visibility(), map::inbounds(), is_draw_tiles_mode(), live_view::is_enabled(), liveview, m, mvwputch(), Character::pos(), POSX, POSY, Character::sees(), u, player::view_offset, VIS_BOOMER, VIS_BOOMER_DARK, VIS_CLEAR, VIS_DARK, VIS_HIDDEN, VIS_LIT, w_terrain, and tripoint::xy().

Referenced by look_around().

◆ draw_minimap()

void game::draw_minimap ( )
private

Definition at line 3272 of file game.cpp.

3273{
3274
3275 // Draw the box
3276 werase( w_minimap );
3278
3279 const tripoint_abs_omt curs = u.global_omt_location();
3280 const point_abs_omt curs2( curs.xy() );
3282 bool drew_mission = targ == overmap::invalid_tripoint;
3283
3284 for( int i = -2; i <= 2; i++ ) {
3285 for( int j = -2; j <= 2; j++ ) {
3286 const point_abs_omt om( curs2 + point( i, j ) );
3287 nc_color ter_color;
3288 tripoint_abs_omt omp( om, get_levz() );
3289 std::string ter_sym;
3290 const bool seen = overmap_buffer.seen( omp );
3291 const bool vehicle_here = overmap_buffer.has_vehicle( omp );
3292 if( overmap_buffer.has_note( omp ) ) {
3293
3294 const std::string &note_text = overmap_buffer.note( omp );
3295
3296 ter_color = c_yellow;
3297 ter_sym = "N";
3298
3299 int symbolIndex = note_text.find( ':' );
3300 int colorIndex = note_text.find( ';' );
3301
3302 bool symbolFirst = symbolIndex < colorIndex;
3303
3304 if( colorIndex > -1 && symbolIndex > -1 ) {
3305 if( symbolFirst ) {
3306 if( colorIndex > 4 ) {
3307 colorIndex = -1;
3308 }
3309 if( symbolIndex > 1 ) {
3310 symbolIndex = -1;
3311 colorIndex = -1;
3312 }
3313 } else {
3314 if( symbolIndex > 4 ) {
3315 symbolIndex = -1;
3316 }
3317 if( colorIndex > 2 ) {
3318 colorIndex = -1;
3319 }
3320 }
3321 } else if( colorIndex > 2 ) {
3322 colorIndex = -1;
3323 } else if( symbolIndex > 1 ) {
3324 symbolIndex = -1;
3325 }
3326
3327 if( symbolIndex > -1 ) {
3328 int symbolStart = 0;
3329 if( colorIndex > -1 && !symbolFirst ) {
3330 symbolStart = colorIndex + 1;
3331 }
3332 ter_sym = note_text.substr( symbolStart, symbolIndex - symbolStart ).c_str()[0];
3333 }
3334
3335 if( colorIndex > -1 ) {
3336
3337 int colorStart = 0;
3338
3339 if( symbolIndex > -1 && symbolFirst ) {
3340 colorStart = symbolIndex + 1;
3341 }
3342
3343 std::string sym = note_text.substr( colorStart, colorIndex - colorStart );
3344
3345 if( sym.length() == 2 ) {
3346 if( sym == "br" ) {
3347 ter_color = c_brown;
3348 } else if( sym == "lg" ) {
3349 ter_color = c_light_gray;
3350 } else if( sym == "dg" ) {
3351 ter_color = c_dark_gray;
3352 }
3353 } else {
3354 char colorID = sym.c_str()[0];
3355 if( colorID == 'r' ) {
3356 ter_color = c_light_red;
3357 } else if( colorID == 'R' ) {
3358 ter_color = c_red;
3359 } else if( colorID == 'g' ) {
3360 ter_color = c_light_green;
3361 } else if( colorID == 'G' ) {
3362 ter_color = c_green;
3363 } else if( colorID == 'b' ) {
3364 ter_color = c_light_blue;
3365 } else if( colorID == 'B' ) {
3366 ter_color = c_blue;
3367 } else if( colorID == 'W' ) {
3368 ter_color = c_white;
3369 } else if( colorID == 'C' ) {
3370 ter_color = c_cyan;
3371 } else if( colorID == 'c' ) {
3372 ter_color = c_light_cyan;
3373 } else if( colorID == 'P' ) {
3374 ter_color = c_pink;
3375 } else if( colorID == 'm' ) {
3376 ter_color = c_magenta;
3377 }
3378 }
3379 }
3380 } else if( !seen ) {
3381 ter_sym = " ";
3382 ter_color = c_black;
3383 } else if( vehicle_here ) {
3384 ter_color = c_cyan;
3385 ter_sym = "c";
3386 } else {
3387 const oter_id &cur_ter = overmap_buffer.ter( omp );
3388 ter_sym = cur_ter->get_symbol();
3389 if( overmap_buffer.is_explored( omp ) ) {
3390 ter_color = c_dark_gray;
3391 } else {
3392 ter_color = cur_ter->get_color();
3393 }
3394 }
3395 if( !drew_mission && targ.xy() == omp.xy() ) {
3396 // If there is a mission target, and it's not on the same
3397 // overmap terrain as the player character, mark it.
3398 // TODO: Inform player if the mission is above or below
3399 drew_mission = true;
3400 if( i != 0 || j != 0 ) {
3401 ter_color = red_background( ter_color );
3402 }
3403 }
3404 if( i == 0 && j == 0 ) {
3405 mvwputch_hi( w_minimap, point( 3, 3 ), ter_color, ter_sym );
3406 } else {
3407 mvwputch( w_minimap, point( 3 + i, 3 + j ), ter_color, ter_sym );
3408 }
3409 }
3410 }
3411
3412 // Print arrow to mission if we have one!
3413 if( !drew_mission ) {
3414 double slope = curs2.x() != targ.x() ?
3415 static_cast<double>( targ.y() - curs2.y() ) / ( targ.x() - curs2.x() ) : 4;
3416
3417 if( curs2.x() == targ.x() || std::fabs( slope ) > 3.5 ) { // Vertical slope
3418 if( targ.y() > curs2.y() ) {
3419 mvwputch( w_minimap, point( 3, 6 ), c_red, "*" );
3420 } else {
3421 mvwputch( w_minimap, point( 3, 0 ), c_red, "*" );
3422 }
3423 } else {
3424 int arrowx = -1;
3425 int arrowy = -1;
3426 if( std::fabs( slope ) >= 1. ) { // y diff is bigger!
3427 arrowy = targ.y() > curs2.y() ? 6 : 0;
3428 arrowx =
3429 static_cast<int>( 3 + 3 * ( targ.y() > curs2.y() ? slope : ( 0 - slope ) ) );
3430 if( arrowx < 0 ) {
3431 arrowx = 0;
3432 }
3433 if( arrowx > 6 ) {
3434 arrowx = 6;
3435 }
3436 } else {
3437 arrowx = targ.x() > curs2.x() ? 6 : 0;
3438 arrowy = static_cast<int>( 3 + 3 * ( targ.x() > curs2.x() ? slope : -slope ) );
3439 if( arrowy < 0 ) {
3440 arrowy = 0;
3441 }
3442 if( arrowy > 6 ) {
3443 arrowy = 6;
3444 }
3445 }
3446 char glyph = '*';
3447 if( targ.z() > u.posz() ) {
3448 glyph = '^';
3449 } else if( targ.z() < u.posz() ) {
3450 glyph = 'v';
3451 }
3452
3453 mvwputch( w_minimap, point( arrowx, arrowy ), c_red, glyph );
3454 }
3455 }
3456
3457 const int sight_points = g->u.overmap_sight_range( g->light_level( g->u.posz() ) );
3458 for( int i = -3; i <= 3; i++ ) {
3459 for( int j = -3; j <= 3; j++ ) {
3460 if( i > -3 && i < 3 && j > -3 && j < 3 ) {
3461 continue; // only do hordes on the border, skip inner map
3462 }
3463 const tripoint_abs_omt omp( curs2 + point( i, j ), get_levz() );
3465 if( overmap_buffer.seen( omp )
3466 && g->u.overmap_los( omp, sight_points ) ) {
3467 mvwputch( w_minimap, point( i + 3, j + 3 ), c_green,
3468 overmap_buffer.get_horde_size( omp ) > HORDE_VISIBILITY_SIZE * 2 ? 'Z' : 'z' );
3469 }
3470 }
3471 }
3472 }
3473
3475}
tripoint_abs_omt get_active_mission_target() const
Returns the target of the active mission or overmap::invalid_tripoint if there is no active mission.
Definition: avatar.cpp:206
constexpr auto & x()
Definition: coordinates.h:118
constexpr auto & z()
Definition: coordinates.h:133
constexpr auto & y()
Definition: coordinates.h:124
constexpr auto xy() const
Definition: coordinates.h:130
static constexpr tripoint_abs_omt invalid_tripoint
Dummy value, used to indicate that a point returned by a function is invalid.
Definition: overmap.h:260
bool seen(const tripoint_abs_omt &p)
const std::string & note(const tripoint_abs_omt &p)
int get_horde_size(const tripoint_abs_omt &p)
bool is_explored(const tripoint_abs_omt &p)
const oter_id & ter(const tripoint_abs_omt &p)
Returns the overmap terrain at the given OMT coordinates.
bool has_note(const tripoint_abs_omt &p)
Uses global overmap terrain coordinates.
bool has_vehicle(const tripoint_abs_omt &p)
nc_color red_background(const nc_color &c)
Definition: color.cpp:515
#define c_blue
Definition: color.h:23
#define c_black
Definition: color.h:17
#define c_light_blue
Definition: color.h:29
#define c_yellow
Definition: color.h:32
#define c_light_cyan
Definition: color.h:30
#define c_cyan
Definition: color.h:24
#define c_light_red
Definition: color.h:27
static constexpr int HORDE_VISIBILITY_SIZE
constexpr scale om
Definition: coordinates.h:34
void mvwputch_hi(const catacurses::window &w, const point &p, nc_color FG, int ch)
Definition: output.cpp:508
std::string get_symbol(const bool from_land_use_code=false) const
Definition: omdata.h:209
nc_color get_color(const bool from_land_use_code=false) const
Definition: omdata.h:217

References c_black, c_blue, c_brown, c_cyan, c_dark_gray, c_green, c_light_blue, c_light_cyan, c_light_gray, c_light_green, c_light_red, c_magenta, c_pink, c_red, c_white, c_yellow, draw_border(), units::fabs(), g, avatar::get_active_mission_target(), oter_t::get_color(), overmapbuffer::get_horde_size(), get_levz(), oter_t::get_symbol(), Character::global_omt_location(), overmapbuffer::has_note(), overmapbuffer::has_vehicle(), HORDE_VISIBILITY_SIZE, overmap::invalid_tripoint, overmapbuffer::is_explored(), mvwputch(), mvwputch_hi(), overmapbuffer::note(), coords::om, overmap_buffer, Character::posz(), red_background(), overmapbuffer::seen(), overmapbuffer::ter(), u, w_minimap, catacurses::werase(), catacurses::wnoutrefresh(), coords::coord_point< Point, Origin, Scale >::x(), coords::coord_point< Point, Origin, Scale >::xy(), coords::coord_point< Point, Origin, Scale >::y(), and coords::coord_point< Point, Origin, Scale >::z().

◆ draw_monster_override()

void game::draw_monster_override ( const tripoint p,
const mtype_id id,
int  count,
bool  more,
Creature::Attitude  att 
)

Definition at line 977 of file animation.cpp.

979{
980}

◆ draw_panels()

void game::draw_panels ( bool  force_draw = false)

Definition at line 3098 of file game.cpp.

3099{
3100 static int previous_turn = -1;
3101 const int current_turn = to_turns<int>( calendar::turn - calendar::turn_zero );
3102 const bool draw_this_turn = current_turn > previous_turn || force_draw;
3103 auto &mgr = panel_manager::get_manager();
3104 int y = 0;
3105 const bool sidebar_right = get_option<std::string>( "SIDEBAR_POSITION" ) == "right";
3106 int spacer = get_option<bool>( "SIDEBAR_SPACERS" ) ? 1 : 0;
3107 int log_height = 0;
3108 for( const window_panel &panel : mgr.get_current_layout() ) {
3109 if( panel.get_height() != -2 && panel.toggle && panel.render() ) {
3110 log_height += panel.get_height() + spacer;
3111 }
3112 }
3113 log_height = std::max( TERMY - log_height, 3 );
3114 for( const window_panel &panel : mgr.get_current_layout() ) {
3115 if( panel.render() ) {
3116 // height clamped to window height.
3117 int h = std::min( panel.get_height(), TERMY - y );
3118 if( h == -2 ) {
3119 h = log_height;
3120 }
3121 h += spacer;
3122 if( panel.toggle && panel.render() && h > 0 ) {
3123 if( panel.always_draw || draw_this_turn ) {
3124 panel.draw( u, catacurses::newwin( h, panel.get_width(),
3125 point( sidebar_right ? TERMX - panel.get_width() : 0, y ) ) );
3126 }
3127 if( show_panel_adm ) {
3128 const std::string panel_name = _( panel.get_name() );
3129 const int panel_name_width = utf8_width( panel_name );
3130 auto label = catacurses::newwin( 1, panel_name_width, point( sidebar_right ?
3131 TERMX - panel.get_width() - panel_name_width - 1 : panel.get_width() + 1, y ) );
3132 werase( label );
3133 mvwprintz( label, point_zero, c_light_red, panel_name );
3135 label = catacurses::newwin( h, 1,
3136 point( sidebar_right ? TERMX - panel.get_width() - 1 : panel.get_width(), y ) );
3137 werase( label );
3138 if( h == 1 ) {
3140 } else {
3142 for( int i = 1; i < h - 1; i++ ) {
3144 }
3145 mvwputch( label, point( 0, h - 1 ), c_light_red, sidebar_right ? LINE_XXOO : LINE_XOOX );
3146 }
3148 }
3149 y += h;
3150 }
3151 }
3152 }
3153 previous_turn = current_turn;
3154}
bool show_panel_adm
Definition: game.h:1014
const time_point turn_zero
Represents time point 0.
Definition: calendar.cpp:26
#define LINE_XOXO
Definition: output.h:39
#define LINE_OXOX
Definition: output.h:40
#define LINE_OXXX
Definition: output.h:48
#define LINE_XOOX
Definition: output.h:44
#define LINE_XXOO
Definition: output.h:41
Struct used for storing labels (easier to json opposed to a std::map<point, std::string>)
Definition: vehicle.h:578

References _, c_light_red, panel_manager::get_manager(), LINE_OXOX, LINE_OXXX, LINE_XOOX, LINE_XOXO, LINE_XXOO, mvwprintz(), mvwputch(), catacurses::newwin(), point_zero, show_panel_adm, TERMX, TERMY, calendar::turn, calendar::turn_zero, u, utf8_width(), catacurses::werase(), and catacurses::wnoutrefresh().

Referenced by draw().

◆ draw_pixel_minimap()

void game::draw_pixel_minimap ( const catacurses::window w)

Definition at line 3156 of file game.cpp.

3157{
3158 w_pixel_minimap = w;
3159}

References w_pixel_minimap.

◆ draw_radiation_override()

void game::draw_radiation_override ( const tripoint p,
int  rad 
)

Definition at line 854 of file animation.cpp.

855{
856}

◆ draw_sct()

void game::draw_sct ( )

Definition at line 805 of file animation.cpp.

806{
807 draw_sct_curses( *this );
808}
void draw_sct_curses(const game &g)
Definition: animation.cpp:772

References anonymous_namespace{animation.cpp}::draw_sct_curses().

Referenced by get_player_input().

◆ draw_ter() [1/2]

void game::draw_ter ( bool  draw_sounds = true)

Definition at line 3212 of file game.cpp.

3213{
3215 draw_sounds );
3216}
bool is_looking
Definition: game.h:224

References draw_ter(), is_looking, Character::pos(), u, and player::view_offset.

Referenced by draw(), and draw_ter().

◆ draw_ter() [2/2]

void game::draw_ter ( const tripoint center,
bool  looking = false,
bool  draw_sounds = true 
)

Definition at line 3218 of file game.cpp.

3219{
3221
3222 m.draw( w_terrain, center );
3223
3224 if( draw_sounds ) {
3226 }
3227
3228 for( Creature &critter : all_creatures() ) {
3229 draw_critter( critter, center );
3230 }
3231
3232 if( !destination_preview.empty() && u.view_offset.z == 0 ) {
3233 // Draw auto-move preview trail
3234 const tripoint &final_destination = destination_preview.back();
3235 tripoint line_center = u.pos() + u.view_offset;
3236 draw_line( final_destination, line_center, destination_preview, true );
3237 mvwputch( w_terrain, final_destination.xy() - u.view_offset.xy() + point( POSX - u.posx(),
3238 POSY - u.posy() ), c_white, 'X' );
3239 }
3240
3241 if( u.controlling_vehicle && !looking ) {
3242 draw_veh_dir_indicator( false );
3243 draw_veh_dir_indicator( true );
3244 }
3245 // Place the cursor over the player as is expected by screen readers.
3246 wmove( w_terrain, -center.xy() + g->u.pos().xy() + point( POSX, POSY ) );
3247}
int posx() const override
Definition: character.h:813
int posy() const override
Definition: character.h:816
void draw_critter(const Creature &critter, const tripoint &center)
Definition: game.cpp:3194
Creature_range all_creatures()
Returns an anonymous range that contains all creatures.
Definition: game.cpp:11936
std::vector< tripoint > destination_preview
Definition: game.h:1066
void draw_veh_dir_indicator(bool next)
Definition: game.cpp:3264
void draw_line(const tripoint &p, const tripoint &center_point, const std::vector< tripoint > &points, bool noreveal=false)
Definition: animation.cpp:677
void draw(const catacurses::window &w, const tripoint &center)
Draw a visible part of the map into w.
Definition: map.cpp:5714
static void draw_footsteps(const catacurses::window &window, const tripoint &offset)
Definition: game.cpp:2884
void wmove(const window &win, const point &p)
Definition: ncurses_def.cpp:98

References all_creatures(), c_white, center, Character::controlling_vehicle, destination_preview, map::draw(), draw_critter(), draw_footsteps(), draw_line(), draw_veh_dir_indicator(), g, m, mvwputch(), Character::pos(), Character::posx(), POSX, Character::posy(), POSY, ter_view_p, u, player::view_offset, w_terrain, catacurses::wmove(), tripoint::xy(), and tripoint::z.

◆ draw_terrain_override()

void game::draw_terrain_override ( const tripoint p,
const ter_id id 
)

Definition at line 867 of file animation.cpp.

868{
869}

◆ draw_trail_to_square()

void game::draw_trail_to_square ( const tripoint t,
bool  bDrawX 
)

Definition at line 6957 of file game.cpp.

6958{
6959 ::draw_trail( u.pos(), u.pos() + t, bDrawX );
6960}
static void draw_trail(const tripoint &start, const tripoint &end, bool bDrawX)
Definition: game.cpp:6927

References draw_trail(), Character::pos(), and u.

◆ draw_trap_override()

void game::draw_trap_override ( const tripoint p,
const trap_id id 
)

Definition at line 906 of file animation.cpp.

907{
908}

◆ draw_veh_dir_indicator()

void game::draw_veh_dir_indicator ( bool  next)

Definition at line 3264 of file game.cpp.

3265{
3266 if( const cata::optional<tripoint> indicator_offset = get_veh_dir_indicator_location( next ) ) {
3267 auto col = next ? c_white : c_dark_gray;
3268 mvwputch( w_terrain, indicator_offset->xy() - u.view_offset.xy() + point( POSX, POSY ), col, 'X' );
3269 }
3270}
cata::optional< tripoint > get_veh_dir_indicator_location(bool next) const
Returns the location where the indicator should go relative to the reality bubble,...
Definition: game.cpp:3249

References c_dark_gray, c_white, get_veh_dir_indicator_location(), mvwputch(), POSX, POSY, u, player::view_offset, w_terrain, and tripoint::xy().

Referenced by draw_ter().

◆ draw_vpart_override()

void game::draw_vpart_override ( const tripoint p,
const vpart_id id,
int  part_mod,
units::angle  veh_dir,
bool  hilite,
const point mount 
)

Definition at line 949 of file animation.cpp.

951{
952}

◆ draw_weather()

void game::draw_weather ( const weather_printable wPrint)

Definition at line 764 of file animation.cpp.

765{
767}
void draw_weather_curses(const catacurses::window &win, const weather_printable &w)
Definition: animation.cpp:745

References anonymous_namespace{animation.cpp}::draw_weather_curses(), and w_terrain.

Referenced by get_player_input().

◆ draw_zones()

void game::draw_zones ( const tripoint start,
const tripoint end,
const tripoint offset 
)

Definition at line 840 of file animation.cpp.

841{
842 draw_zones_curses( w_terrain, start, end, offset );
843}
void draw_zones_curses(const catacurses::window &w, const tripoint &start, const tripoint &end, const tripoint &offset)
Definition: animation.cpp:813

References anonymous_namespace{animation.cpp}::draw_zones_curses(), and w_terrain.

◆ drop()

void game::drop ( )
private

Definition at line 8000 of file game.cpp.

8001{
8003}
void drop(item_location loc, const tripoint &where)
Drops an item to the specified location.
Definition: character.cpp:2557
drop_locations multidrop(player &p)
Select items to drop.

References Character::drop(), game_menus::inv::multidrop(), Character::pos(), and u.

Referenced by handle_action().

◆ drop_in_direction()

void game::drop_in_direction ( )
private

Definition at line 8005 of file game.cpp.

8006{
8007 if( const cata::optional<tripoint> pnt = choose_adjacent( _( "Drop where?" ) ) ) {
8008 u.drop( game_menus::inv::multidrop( u ), *pnt );
8009 }
8010}

References _, choose_adjacent(), Character::drop(), game_menus::inv::multidrop(), and u.

Referenced by handle_action().

◆ dump_stats()

bool game::dump_stats ( const std::string &  what,
dump_mode  mode,
const std::vector< std::string > &  opts 
)

write statistics to stdout and

Returns
true if successful

Definition at line 38 of file dump.cpp.

40{
41 try {
43 } catch( const std::exception &err ) {
44 std::cerr << "Error loading data from json: " << err.what() << std::endl;
45 return false;
46 }
47
48 std::vector<std::string> header;
49 std::vector<std::vector<std::string>> rows;
50
51 int scol = 0; // sorting column
52
53 std::map<std::string, standard_npc> test_npcs;
54 test_npcs[ "S1" ] = standard_npc( "S1", { 0, 0, 2 }, { "gloves_survivor", "mask_lsurvivor" },
55 4, 8, 10, 8, 10 /* DEX 10, PER 10 */ );
56 test_npcs[ "S2" ] = standard_npc( "S2", { 0, 0, 3 }, { "gloves_fingerless", "sunglasses" },
57 4, 8, 8, 8, 10 /* PER 10 */ );
58 test_npcs[ "S3" ] = standard_npc( "S3", { 0, 0, 4 }, { "gloves_plate", "helmet_plate" },
59 4, 10, 8, 8, 8 /* STAT 10 */ );
60 test_npcs[ "S4" ] = standard_npc( "S4", { 0, 0, 5 }, {}, 0, 8, 10, 8, 10 /* DEX 10, PER 10 */ );
61 test_npcs[ "S5" ] = standard_npc( "S5", { 0, 0, 6 }, {}, 4, 8, 10, 8, 10 /* DEX 10, PER 10 */ );
62 test_npcs[ "S6" ] = standard_npc( "S6", { 0, 0, 7 }, { "gloves_hsurvivor", "mask_hsurvivor" },
63 4, 8, 10, 8, 10 /* DEX 10, PER 10 */ );
64
65 std::map<std::string, item> test_items;
66 test_items[ "G1" ] = item( "glock_19" ).ammo_set( itype_id( "9mm" ) );
67 test_items[ "G2" ] = item( "hk_mp5" ).ammo_set( itype_id( "9mm" ) );
68 test_items[ "G3" ] = item( "ar15" ).ammo_set( itype_id( "223" ) );
69 test_items[ "G4" ] = item( "remington_700" ).ammo_set( itype_id( "270" ) );
70 test_items[ "G4" ].put_in( item( "rifle_scope" ) );
71
72 if( what == "AMMO" ) {
73 header = {
74 "Name", "Ammo", "Volume", "Weight", "Stack",
75 "Range", "Dispersion", "Recoil", "Damage", "Pierce", "Damage multiplier"
76 };
77 auto dump = [&rows]( const item & obj ) {
78 std::vector<std::string> r;
79 r.push_back( obj.tname( 1, false ) );
80 r.push_back( obj.ammo_type().str() );
81 r.push_back( std::to_string( obj.volume() / units::legacy_volume_factor ) );
82 r.push_back( std::to_string( to_gram( obj.weight() ) ) );
83 r.push_back( std::to_string( obj.type->stack_size ) );
84 r.push_back( std::to_string( obj.type->ammo->range ) );
85 r.push_back( std::to_string( obj.type->ammo->dispersion ) );
86 r.push_back( std::to_string( obj.type->ammo->recoil ) );
87 damage_instance damage = obj.type->ammo->damage;
88 r.push_back( std::to_string( damage.total_damage() ) );
89 r.push_back( std::to_string( damage.empty() ? 0 : ( *damage.begin() ).res_pen ) );
90 rows.push_back( r );
91 };
92 for( const itype *e : item_controller->all() ) {
93 if( e->ammo ) {
94 dump( item( e, calendar::turn, item::solitary_tag {} ) );
95 }
96 }
97
98 } else if( what == "ARMOR" ) {
99 header = {
100 "Name", "Encumber (fit)", "Warmth", "Weight", "Storage", "Coverage", "Bash", "Cut", "Bullet", "Acid", "Fire"
101 };
102 auto dump = [&rows]( const item & obj ) {
103 std::vector<std::string> r;
104 r.push_back( obj.tname( 1, false ) );
105 r.push_back( std::to_string( obj.get_encumber( g->u ) ) );
106 r.push_back( std::to_string( obj.get_warmth() ) );
107 r.push_back( std::to_string( to_gram( obj.weight() ) ) );
108 r.push_back( std::to_string( obj.get_storage() / units::legacy_volume_factor ) );
109 r.push_back( std::to_string( obj.get_coverage() ) );
110 r.push_back( std::to_string( obj.bash_resist() ) );
111 r.push_back( std::to_string( obj.cut_resist() ) );
112 r.push_back( std::to_string( obj.bullet_resist() ) );
113 r.push_back( std::to_string( obj.acid_resist() ) );
114 r.push_back( std::to_string( obj.fire_resist() ) );
115 rows.push_back( r );
116 };
117
118 body_part bp = opts.empty() ? num_bp : get_body_part_token( opts.front() );
119
120 for( const itype *e : item_controller->all() ) {
121 if( e->armor ) {
122 item obj( e );
123 if( bp == num_bp || obj.covers( bp ) ) {
124 if( obj.has_flag( flag_VARSIZE ) ) {
125 obj.set_flag( "FIT" );
126 }
127 dump( obj );
128 }
129 }
130 }
131
132 } else if( what == "EDIBLE" ) {
133 header = {
134 "Name", "Volume", "Weight", "Stack", "Calories", "Quench", "Healthy"
135 };
136 for( const auto &v : vitamin::all() ) {
137 header.push_back( v.second.name() );
138 }
139 auto dump = [&rows]( const item & obj ) {
140 std::vector<std::string> r;
141 r.push_back( obj.tname( 1, false ) );
142 r.push_back( std::to_string( obj.volume() / units::legacy_volume_factor ) );
143 r.push_back( std::to_string( to_gram( obj.weight() ) ) );
144 r.push_back( std::to_string( obj.type->stack_size ) );
145 r.push_back( std::to_string( obj.get_comestible()->default_nutrition.kcal ) );
146 r.push_back( std::to_string( obj.get_comestible()->quench ) );
147 r.push_back( std::to_string( obj.get_comestible()->healthy ) );
148 auto vits = obj.get_comestible()->default_nutrition.vitamins;
149 for( const auto &v : vitamin::all() ) {
150 r.push_back( std::to_string( vits[ v.first ] ) );
151 }
152 rows.push_back( r );
153 };
154
155 for( const itype *e : item_controller->all() ) {
157
158 if( food.is_food() && g->u.can_eat( food ).success() ) {
159 dump( food );
160 }
161 }
162
163 } else if( what == "GUN" ) {
164 header = {
165 "Name", "Ammo", "Volume", "Weight", "Capacity",
166 "Range", "Dispersion", "Effective recoil", "Damage", "Pierce",
167 "Aim time", "Effective range", "Snapshot range", "Max range"
168 };
169
170 std::set<std::string> locations;
171 for( const itype *e : item_controller->all() ) {
172 if( e->gun ) {
173 std::transform( e->gun->valid_mod_locations.begin(),
174 e->gun->valid_mod_locations.end(),
175 std::inserter( locations, locations.begin() ),
176 []( const std::pair<gunmod_location, int> &q ) {
177 return q.first.name();
178 } );
179 }
180 }
181 for( const auto &e : locations ) {
182 header.push_back( e );
183 }
184
185 auto dump = [&rows, &locations]( const standard_npc & who, const item & obj ) {
186 std::vector<std::string> r;
187 r.push_back( obj.tname( 1, false ) );
188 r.push_back( !obj.ammo_types().empty() ? enumerate_as_string( obj.ammo_types().begin(),
189 obj.ammo_types().end(), []( const ammotype & at ) {
190 return at.str();
192 r.push_back( std::to_string( obj.volume() / units::legacy_volume_factor ) );
193 r.push_back( std::to_string( to_gram( obj.weight() ) ) );
194 r.push_back( std::to_string( obj.ammo_capacity() ) );
195 r.push_back( std::to_string( obj.gun_range() ) );
196 r.push_back( std::to_string( obj.gun_dispersion() ) );
197 r.push_back( std::to_string( obj.gun_recoil() ) );
198 damage_instance damage = obj.gun_damage();
199 r.push_back( std::to_string( damage.total_damage() ) );
200 r.push_back( std::to_string( damage.empty() ? 0 : ( *damage.begin() ).res_pen ) );
201
202 r.push_back( std::to_string( who.gun_engagement_moves( obj ) ) );
203
204 for( const auto &e : locations ) {
205 const auto &vml = obj.type->gun->valid_mod_locations;
206 const auto iter = vml.find( e );
207 r.push_back( std::to_string( iter != vml.end() ? iter->second : 0 ) );
208 }
209 rows.push_back( r );
210 };
211 for( const itype *e : item_controller->all() ) {
212 if( e->gun ) {
213 item gun( e );
214 if( !gun.magazine_integral() ) {
215 gun.put_in( item( gun.magazine_default() ) );
216 }
217 gun.ammo_set( gun.ammo_default( false ), gun.ammo_capacity() );
218
219 dump( test_npcs[ "S1" ], gun );
220
221 if( gun.type->gun->barrel_length > 0_ml ) {
222 gun.put_in( item( "barrel_small" ) );
223 dump( test_npcs[ "S1" ], gun );
224 }
225 }
226 }
227
228 } else if( what == "RECIPE" ) {
229
230 // optionally filter recipes to include only those using specified skills
231 recipe_subset dict;
232 for( const auto &r : recipe_dict ) {
233 if( opts.empty() || std::any_of( opts.begin(), opts.end(), [&r]( const std::string & s ) {
234 if( r.second.skill_used == skill_id( s ) && r.second.difficulty > 0 ) {
235 return true;
236 }
237 const auto iter = r.second.required_skills.find( skill_id( s ) );
238 return iter != r.second.required_skills.end() && iter->second > 0;
239 } ) ) {
240 dict.include( &r.second );
241 }
242 }
243
244 // only consider skills that are required by at least one recipe
245 std::vector<Skill> sk;
246 std::copy_if( Skill::skills.begin(), Skill::skills.end(),
247 std::back_inserter( sk ), [&dict]( const Skill & s ) {
248 return std::any_of( dict.begin(), dict.end(), [&s]( const recipe * r ) {
249 return r->skill_used == s.ident() ||
250 r->required_skills.find( s.ident() ) != r->required_skills.end();
251 } );
252 } );
253
254 header = { "Result" };
255
256 for( const auto &e : sk ) {
257 header.push_back( e.ident().str() );
258 }
259
260 for( const recipe *e : dict ) {
261 std::vector<std::string> r;
262 r.push_back( e->result_name() );
263 for( const auto &s : sk ) {
264 if( e->skill_used == s.ident() ) {
265 r.push_back( std::to_string( e->difficulty ) );
266 } else {
267 auto iter = e->required_skills.find( s.ident() );
268 r.push_back( std::to_string( iter != e->required_skills.end() ? iter->second : 0 ) );
269 }
270 }
271 rows.push_back( r );
272 }
273
274 } else if( what == "VEHICLE" ) {
275 header = {
276 "Name", "Weight (empty)", "Weight (fueled)",
277 "Max velocity (mph)", "Safe velocity (mph)", "Acceleration (mph/turn)",
278 "Aerodynamics coeff", "Rolling coeff", "Static Drag", "Offroad %"
279 };
280 auto dump = [&rows]( const vproto_id & obj ) {
281 vehicle veh_empty( obj, 0, 0 );
282 vehicle veh_fueled( obj, 100, 0 );
283
284 std::vector<std::string> r;
285 r.push_back( veh_empty.name );
286 r.push_back( std::to_string( to_kilogram( veh_empty.total_mass() ) ) );
287 r.push_back( std::to_string( to_kilogram( veh_fueled.total_mass() ) ) );
288 r.push_back( std::to_string( veh_fueled.max_velocity() / 100 ) );
289 r.push_back( std::to_string( veh_fueled.safe_velocity() / 100 ) );
290 r.push_back( std::to_string( veh_fueled.acceleration() / 100 ) );
291 r.push_back( std::to_string( veh_fueled.coeff_air_drag() ) );
292 r.push_back( std::to_string( veh_fueled.coeff_rolling_drag() ) );
293 r.push_back( std::to_string( veh_fueled.static_drag( false ) ) );
294 r.push_back( std::to_string( static_cast<int>( 50 *
295 veh_fueled.k_traction( veh_fueled.wheel_area() ) ) ) );
296 rows.push_back( r );
297 };
298 for( auto &e : vehicle_prototype::get_all() ) {
299 dump( e );
300 }
301
302 } else if( what == "VPART" ) {
303 header = {
304 "Name", "Location", "Weight", "Size"
305 };
306 auto dump = [&rows]( const vpart_info & obj ) {
307 std::vector<std::string> r;
308 r.push_back( obj.name() );
309 r.push_back( obj.location );
310 int w = std::ceil( to_gram( item( obj.item ).weight() ) / 1000.0 );
311 r.push_back( std::to_string( w ) );
312 r.push_back( std::to_string( obj.size / units::legacy_volume_factor ) );
313 rows.push_back( r );
314 };
315 for( const auto &e : vpart_info::all() ) {
316 dump( e.second );
317 }
318
319 } else {
320 std::cerr << "unknown argument: " << what << std::endl;
321 return false;
322 }
323
324 rows.erase( std::remove_if( rows.begin(), rows.end(), []( const std::vector<std::string> &e ) {
325 return e.empty();
326 } ), rows.end() );
327
328 if( scol >= 0 ) {
329 std::sort( rows.begin(), rows.end(), [&scol]( const std::vector<std::string> &lhs,
330 const std::vector<std::string> &rhs ) {
331 return localized_compare( lhs[ scol ], rhs[ scol ] );
332 } );
333 }
334
335 rows.erase( std::unique( rows.begin(), rows.end() ), rows.end() );
336
337 switch( mode ) {
338 case dump_mode::TSV:
339 rows.insert( rows.begin(), header );
340 for( const auto &r : rows ) {
341 // NOLINTNEXTLINE(cata-text-style): using tab to align the output
342 std::copy( r.begin(), r.end() - 1, std::ostream_iterator<std::string>( std::cout, "\t" ) );
343 std::cout << r.back() << "\n";
344 }
345 break;
346
347 case dump_mode::HTML:
348 std::cout << "<table>";
349
350 std::cout << "<thead>";
351 std::cout << "<tr>";
352 for( const auto &col : header ) {
353 std::cout << "<th>" << col << "</th>";
354 }
355 std::cout << "</tr>";
356 std::cout << "</thead>";
357
358 std::cout << "<tdata>";
359 for( const auto &r : rows ) {
360 std::cout << "<tr>";
361 for( const auto &col : r ) {
362 std::cout << "<td>" << col << "</td>";
363 }
364 std::cout << "</tr>";
365 }
366 std::cout << "</tdata>";
367
368 std::cout << "</table>";
369 break;
370 }
371
372 return true;
373}
body_part get_body_part_token(const std::string &id)
Returns the matching body_part token from the corresponding body_part string.
Definition: bodypart.cpp:180
body_part
Definition: bodypart.h:39
std::string to_string(const time_duration &d)
Returns a string showing a duration.
Definition: calendar.cpp:327
Definition: skill.h:33
static std::vector< Skill > skills
Definition: skill.h:49
const skill_id & ident() const
Definition: skill.h:65
units::mass weight(bool include_contents=true, bool integral=false) const
Definition: item.cpp:4879
void put_in(const item &payload)
Puts the given item into this one, no checks are performed.
Definition: item.cpp:995
item & ammo_set(const itype_id &ammo, int qty=-1)
Filter setting the ammo for this instance Any existing ammo is removed.
Definition: item.cpp:590
std::set< constrecipe * >::const_iterator begin() const
std::set< constrecipe * >::const_iterator end() const
void include(const recipe *r, int custom_difficulty=-1)
Include a recipe to the subset.
Definition: recipe.h:35
An NPC with standard stats.
Definition: npc.h:1393
static const std::map< vitamin_id, vitamin > & all()
Get all currently loaded vitamins.
Definition: vitamin.cpp:98
static const std::map< vpart_id, vpart_info > & all()
Definition: veh_type.cpp:694
static const std::string flag_VARSIZE("VARSIZE")
std::unique_ptr< Item_factory > item_controller
void transform(player &p, const tripoint &pos)
Transform the examined object into the object specified by its transforms_into property.
Definition: iexamine.cpp:1638
void load_core_bn_modfiles()
Load & finalize modlist that consists of single vanilla BN core "mod".
Definition: init.cpp:861
static constexpr volume legacy_volume_factor
Definition: units_volume.h:50
constexpr value_type to_gram(const quantity< value_type, mass_in_milligram_tag > &v)
Definition: units_mass.h:67
constexpr value_type to_kilogram(const quantity< value_type, mass_in_milligram_tag > &v)
Definition: units_mass.h:73
std::string enumerate_as_string(const _Container &values, enumeration_conjunction conj=enumeration_conjunction::and_)
Definition: output.h:680
recipe_dictionary recipe_dict
float total_damage() const
Definition: damage.cpp:75
std::vector< damage_unit >::iterator begin()
Definition: damage.cpp:120
bool empty() const
Definition: damage.cpp:88
Default (or randomized) charges except if counted by charges then only one charge.
Definition: item.h:197
Definition: itype.h:836
static std::vector< vproto_id > get_all()
Definition: veh_type.cpp:1156

References vitamin::all(), item::ammo_capacity(), item::ammo_default(), item::ammo_set(), damage_instance::begin(), item::covers(), damage_instance::empty(), enumerate_as_string(), flag_VARSIZE(), g, get_body_part_token(), itype::gun, item::has_flag(), Skill::ident(), recipe_subset::include(), item_controller, itype_id, units::legacy_volume_factor, init::load_core_bn_modfiles(), anonymous_namespace{overmap_location.cpp}::locations, item::magazine_default(), item::magazine_integral(), none, num_bp, item::put_in(), recipe_dict, item::set_flag(), Skill::skills, units::to_gram(), to_string(), damage_instance::total_damage(), iexamine::transform(), calendar::turn, and item::type.

◆ events()

event_bus & game::events ( )

Definition at line 2699 of file game.cpp.

2700{
2701 return *event_bus_ptr;
2702}
pimpl< event_bus > event_bus_ptr
Definition: game.h:953

References event_bus_ptr.

Referenced by cleanup_at_end(), and game().

◆ exam_vehicle()

void game::exam_vehicle ( vehicle veh,
const point cp = point_zero 
)

open vehicle interaction screen

Definition at line 4953 of file game.cpp.

4954{
4955 if( veh.magic ) {
4956 add_msg( m_info, _( "This is your %s" ), veh.name );
4957 return;
4958 }
4959 auto act = veh_interact::run( veh, c );
4960 if( act ) {
4961 u.moves = 0;
4963 }
4964}
static player_activity run(vehicle &veh, const point &p)
bool magic
Definition: vehicle.h:1866
constexpr double c
Definition: magic.cpp:1032
activity_id act
Definition: sounds.cpp:75

References _, act, add_msg(), Character::assign_activity(), c, m_info, vehicle::magic, Creature::moves, vehicle::name, veh_interact::run(), and u.

◆ examine() [1/2]

void game::examine ( )
private

Definition at line 5344 of file game.cpp.

5345{
5346 // if we are driving a vehicle, examine the
5347 // current tile without asking.
5348 const optional_vpart_position vp = m.veh_at( u.pos() );
5349 if( vp && vp->vehicle().player_in_control( u ) ) {
5350 examine( u.pos() );
5351 return;
5352 }
5353
5354 const cata::optional<tripoint> examp_ = choose_adjacent_highlight( _( "Examine where?" ),
5355 _( "There is nothing that can be examined nearby." ),
5356 ACTION_EXAMINE, false );
5357 if( !examp_ ) {
5358 return;
5359 }
5360 u.manual_examine = true;
5361 examine( *examp_ );
5362 u.manual_examine = false;
5363}
cata::optional< tripoint > choose_adjacent_highlight(const std::string &message, const std::string &failure_message, const action_id action, bool allow_vertical)
Request player input of adjacent tile with highlighting, possibly on different z-level.
Definition: action.cpp:1042
@ ACTION_EXAMINE
Examine or pick up items from adjacent square.
Definition: action.h:105
void examine()
Definition: game.cpp:5344
bool manual_examine
Definition: player.h:479

References _, ACTION_EXAMINE, choose_adjacent_highlight(), examine(), m, player::manual_examine, Character::pos(), u, and map::veh_at().

Referenced by examine(), and handle_action().

◆ examine() [2/2]

void game::examine ( const tripoint p)
private

Definition at line 5432 of file game.cpp.

5433{
5434 if( disable_robot( examp ) ) {
5435 return;
5436 }
5437
5438 Creature *c = critter_at( examp );
5439 if( c != nullptr ) {
5440 monster *mon = dynamic_cast<monster *>( c );
5441 if( mon != nullptr ) {
5442 add_msg( _( "There is a %s." ), mon->get_name() );
5443 if( mon->has_effect( effect_pet ) && !u.is_mounted() ) {
5444 if( monexamine::pet_menu( *mon ) ) {
5445 return;
5446 }
5447 } else if( mon->has_flag( MF_RIDEABLE_MECH ) && !mon->has_effect( effect_pet ) ) {
5448 if( monexamine::mech_hack( *mon ) ) {
5449 return;
5450 }
5451 } else if( mon->has_flag( MF_PAY_BOT ) ) {
5452 if( monexamine::pay_bot( *mon ) ) {
5453 return;
5454 }
5455 } else if( mon->attitude_to( u ) == Creature::A_FRIENDLY && !u.is_mounted() ) {
5456 if( monexamine::mfriend_menu( *mon ) ) {
5457 return;
5458 }
5459 }
5460 } else if( u.is_mounted() ) {
5461 add_msg( m_warning, _( "You cannot do that while mounted." ) );
5462 }
5463 npc *np = dynamic_cast<npc *>( c );
5464 if( np != nullptr && !u.is_mounted() ) {
5465 if( npc_menu( *np ) ) {
5466 return;
5467 }
5468 } else if( np != nullptr && u.is_mounted() ) {
5469 add_msg( m_warning, _( "You cannot do that while mounted." ) );
5470 }
5471 }
5472
5473 const optional_vpart_position vp = m.veh_at( examp );
5474 if( vp && u.is_mounted() ) {
5475 if( !u.mounted_creature->has_flag( MF_RIDEABLE_MECH ) ) {
5476 add_msg( m_warning, _( "You cannot interact with a vehicle while mounted." ) );
5477 } else {
5478 vp->vehicle().interact_with( examp, vp->part_index() );
5479 return;
5480 }
5481 } else if( vp && !u.is_mounted() ) {
5482 vp->vehicle().interact_with( examp, vp->part_index() );
5483 return;
5484 }
5485
5486 if( m.has_flag( "CONSOLE", examp ) && !u.is_mounted() ) {
5487 use_computer( examp );
5488 return;
5489 } else if( m.has_flag( "CONSOLE", examp ) && u.is_mounted() ) {
5490 add_msg( m_warning, _( "You cannot use a console while mounted." ) );
5491 }
5492 const furn_t &xfurn_t = m.furn( examp ).obj();
5493 const ter_t &xter_t = m.ter( examp ).obj();
5494
5495 const tripoint player_pos = u.pos();
5496
5497 if( m.has_furn( examp ) && !u.is_mounted() ) {
5498 xfurn_t.examine( u, examp );
5499 } else if( m.has_furn( examp ) && u.is_mounted() ) {
5500 add_msg( m_warning, _( "You cannot do that while mounted." ) );
5501 } else {
5502 if( !u.is_mounted() ) {
5503 xter_t.examine( u, examp );
5504 } else if( u.is_mounted() && xter_t.examine == &iexamine::none ) {
5505 xter_t.examine( u, examp );
5506 } else {
5507 add_msg( m_warning, _( "You cannot do that while mounted." ) );
5508 }
5509 }
5510
5511 // Did the player get moved? Bail out if so; our examp probably
5512 // isn't valid anymore.
5513 if( player_pos != u.pos() ) {
5514 return;
5515 }
5516
5517 bool none = true;
5518 if( xter_t.examine != &iexamine::none || xfurn_t.examine != &iexamine::none ) {
5519 none = false;
5520 }
5521
5522 if( !m.tr_at( examp ).is_null() && !u.is_mounted() ) {
5523 iexamine::trap( u, examp );
5524 } else if( !m.tr_at( examp ).is_null() && u.is_mounted() ) {
5525 add_msg( m_warning, _( "You cannot do that while mounted." ) );
5526 }
5527
5528 // In case of teleport trap or somesuch
5529 if( player_pos != u.pos() ) {
5530 return;
5531 }
5532
5533 // Feedback for fire lasting time, this can be judged while mounted
5534 const std::string fire_fuel = get_fire_fuel_string( examp );
5535 if( !fire_fuel.empty() ) {
5536 add_msg( fire_fuel );
5537 }
5538
5539 if( m.has_flag( "SEALED", examp ) ) {
5540 if( none ) {
5541 if( m.has_flag( "UNSTABLE", examp ) ) {
5542 add_msg( _( "The %s is too unstable to remove anything." ), m.name( examp ) );
5543 } else {
5544 add_msg( _( "The %s is firmly sealed." ), m.name( examp ) );
5545 }
5546 }
5547 } else {
5548 //examp has no traps, is a container and doesn't have a special examination function
5549 if( m.tr_at( examp ).is_null() && m.i_at( examp ).empty() &&
5550 m.has_flag( "CONTAINER", examp ) && none ) {
5551 add_msg( _( "It is empty." ) );
5552 } else if( ( m.has_flag( TFLAG_FIRE_CONTAINER, examp ) &&
5553 xfurn_t.examine == &iexamine::fireplace ) ||
5554 xfurn_t.examine == &iexamine::workbench ||
5555 xfurn_t.examine == &iexamine::transform ) {
5556 return;
5557 } else {
5559 if( !u.is_mounted() ) {
5560 pickup::pick_up( examp, 0 );
5561 }
5562 }
5563 }
5564}
shared_ptr_fast< monster > mounted_creature
Definition: character.h:1588
@ A_FRIENDLY
Definition: creature.h:171
void use_computer(const tripoint &p)
Checks to see if a player can use a computer (not illiterate, etc.) and uses if able.
Definition: game.cpp:4462
bool disable_robot(const tripoint &p)
If there is a robot (that can be disabled), query the player and try to disable it.
Definition: game.cpp:8586
bool npc_menu(npc &who)
Returns true if the menu handled stuff and player shouldn't do anything else.
Definition: game.cpp:5235
bool empty() const
Definition: item_stack.cpp:15
bool has_furn(const tripoint &p) const
Definition: map.cpp:1343
const trap & tr_at(const tripoint &p) const
Definition: map.cpp:5139
ter_id ter(const tripoint &p) const
Definition: map.cpp:1498
Attitude attitude_to(const Creature &other) const override
Attitude (of this creature) towards another creature.
Definition: monster.cpp:1040
std::string get_name() const override
Definition: monster.cpp:488
static std::string get_fire_fuel_string(const tripoint &examp)
Definition: game.cpp:5365
@ TFLAG_FIRE_CONTAINER
Definition: mapdata.h:293
void fireplace(player &p, const tripoint &examp)
Definition: iexamine.cpp:2915
void workbench(player &p, const tripoint &examp)
Definition: iexamine.cpp:6193
void none(player &p, const tripoint &examp)
Nothing player can interact with here.
Definition: iexamine.cpp:251
void trap(player &p, const tripoint &examp)
Definition: iexamine.cpp:3814
bool pet_menu(monster &z)
Definition: monexamine.cpp:67
bool mech_hack(monster &z)
Definition: monexamine.cpp:428
bool mfriend_menu(monster &z)
Definition: monexamine.cpp:502
bool pay_bot(monster &z)
Definition: monexamine.cpp:461
void pick_up(const tripoint &p, int min, from_where get_items_from=prompt)
Pick up items; 'g' or ',' or via examine()
Definition: pickup.cpp:571
iexamine_function examine
Definition: mapdata.h:402
Definition: mapdata.h:461
bool is_null() const
Whether this is the null-traps, aka no trap at all.
Definition: trap.cpp:245

References _, Creature::A_FRIENDLY, add_msg(), monster::attitude_to(), c, critter_at(), disable_robot(), effect_pet, item_stack::empty(), map_data_common_t::examine, iexamine::fireplace(), map::furn(), get_fire_fuel_string(), monster::get_name(), Creature::has_effect(), map::has_flag(), monster::has_flag(), map::has_furn(), map::i_at(), Character::is_mounted(), trap::is_null(), m, m_warning, monexamine::mech_hack(), MF_PAY_BOT, MF_RIDEABLE_MECH, monexamine::mfriend_menu(), Character::mounted_creature, map::name(), none, iexamine::none(), npc_menu(), int_id< T >::obj(), monexamine::pay_bot(), monexamine::pet_menu(), pickup::pick_up(), Character::pos(), sounds::process_sound_markers(), map::ter(), TFLAG_FIRE_CONTAINER, map::tr_at(), iexamine::transform(), iexamine::trap(), u, use_computer(), map::veh_at(), and iexamine::workbench().

◆ extended_description()

void game::extended_description ( const tripoint p)

Long description of (visible) things at tile.

Definition at line 51 of file descriptions.cpp.

52{
54 const int top = 3;
55 int width = 0;
56 catacurses::window w_head;
57 catacurses::window w_main;
58 ui.on_screen_resize( [&]( ui_adaptor & ui ) {
59 const int left = 0;
60 const int right = TERMX;
61 const int bottom = TERMY;
62 width = right - left;
63 const int height = bottom - top;
64 w_head = catacurses::newwin( top, TERMX, point_zero );
65 w_main = catacurses::newwin( height, width, point( left, top ) );
66 ui.position( point_zero, point( TERMX, TERMY ) );
67 } );
68 ui.mark_resize();
69
70 // Default to critter (if any), furniture (if any), then terrain.
72 if( seen_critter( *this, p ) != nullptr ) {
74 } else if( get_map().has_furn( p ) ) {
76 }
77
78 std::string action;
79 input_context ctxt( "EXTENDED_DESCRIPTION" );
80 ctxt.register_action( "CREATURE" );
81 ctxt.register_action( "FURNITURE" );
82 ctxt.register_action( "TERRAIN" );
83 ctxt.register_action( "CONFIRM" );
84 ctxt.register_action( "QUIT" );
85 ctxt.register_action( "HELP_KEYBINDINGS" );
86
87 ui.on_redraw( [&]( const ui_adaptor & ) {
88 werase( w_head );
90 _( "[%s] describe creatures, [%s] describe furniture, "
91 "[%s] describe terrain, [%s] close." ),
92 ctxt.get_desc( "CREATURE" ), ctxt.get_desc( "FURNITURE" ),
93 ctxt.get_desc( "TERRAIN" ), ctxt.get_desc( "QUIT" ) );
94
95 // Set up line drawings
96 for( int i = 0; i < TERMX; i++ ) {
97 mvwputch( w_head, point( i, top - 1 ), c_white, LINE_OXOX );
98 }
99
100 wnoutrefresh( w_head );
101
102 std::string desc;
103 // Allow looking at invisible tiles - player may want to examine hallucinations etc.
104 switch( cur_target ) {
106 const Creature *critter = seen_critter( *this, p );
107 if( critter != nullptr ) {
108 desc = critter->extended_description();
109 } else {
110 desc = _( "You do not see any creature here." );
111 }
112 }
113 break;
115 if( !u.sees( p ) || !m.has_furn( p ) ) {
116 desc = _( "You do not see any furniture here." );
117 } else {
118 const furn_id fid = m.furn( p );
119 if( display_mod_source ) {
120 const std::string mod_src = enumerate_as_string( fid->src.begin(),
121 fid->src.end(), []( const std::pair<furn_str_id, mod_id> &source ) {
122 return string_format( "'%s'", source.second->name() );
124 desc = string_format( _( "Origin: %s\n%s" ), mod_src, fid->extended_description() );
125 } else {
126 desc = fid.obj().extended_description();
127 }
128 }
129 break;
131 if( !u.sees( p ) ) {
132 desc = _( "You can't see the terrain here." );
133 } else {
134 const ter_id tid = m.ter( p );
135 if( display_mod_source ) {
136 const std::string mod_src = enumerate_as_string( tid->src.begin(),
137 tid->src.end(), []( const std::pair<ter_str_id, mod_id> &source ) {
138 return string_format( "'%s'", source.second->name() );
140 desc = string_format( _( "Origin: %s\n%s" ), mod_src, tid->extended_description() );
141 } else {
142 desc = tid.obj().extended_description();
143 }
144 }
145 break;
146 }
147
148 std::string signage = m.get_signage( p );
149 if( !signage.empty() ) {
150 // NOLINTNEXTLINE(cata-text-style): the question mark does not end a sentence
151 desc += u.has_trait( trait_ILLITERATE ) ? _( "\nSign: ???" ) : string_format( _( "\nSign: %s" ),
152 signage );
153 }
154
155 werase( w_main );
156 fold_and_print_from( w_main, point_zero, width, 0, c_light_gray, desc );
157 wnoutrefresh( w_main );
158 } );
159
160 do {
162 action = ctxt.handle_input();
163 if( action == "CREATURE" ) {
164 cur_target = description_target::creature;
165 } else if( action == "FURNITURE" ) {
167 } else if( action == "TERRAIN" ) {
168 cur_target = description_target::terrain;
169 }
170 } while( action != "CONFIRM" && action != "QUIT" );
171}
bool display_mod_source
Display mod source for items, furniture, terrain and monsters.
virtual std::string extended_description() const =0
friend map & get_map()
Definition: map.cpp:146
std::string get_signage(const tripoint &p) const
Definition: map.cpp:4000
static const trait_id trait_ILLITERATE("ILLITERATE")
static const Creature * seen_critter(const game &g, const tripoint &p)
description_target
int fold_and_print_from(const catacurses::window &w, const point &begin, int width, int begin_line, const nc_color &base_color, const std::string &text)
Like fold_and_print, but starts the output with the N-th line of the folded string.
Definition: output.cpp:311
std::vector< std::pair< furn_str_id, mod_id > > src
Definition: mapdata.h:498
std::string extended_description() const
std::vector< std::pair< ter_str_id, mod_id > > src
Definition: mapdata.h:463

References _, action, arrow, c_light_gray, c_white, creature, display_mod_source, enumerate_as_string(), map_data_common_t::extended_description(), Creature::extended_description(), fold_and_print_from(), map::furn(), furniture, input_context::get_desc(), get_map, map::get_signage(), input_context::handle_input(), map::has_furn(), Character::has_trait(), left, LINE_OXOX, m, mvwprintz(), mvwputch(), catacurses::newwin(), int_id< T >::obj(), point_zero, ui_manager::redraw(), input_context::register_action(), right, seen_critter(), Character::sees(), ter_t::src, furn_t::src, string_format(), map::ter(), TERMX, TERMY, terrain, trait_ILLITERATE, u, catacurses::werase(), and catacurses::wnoutrefresh().

Referenced by look_around().

◆ find_nearby_items()

std::vector< map_item_stack > game::find_nearby_items ( int  iRadius)
private

Definition at line 6885 of file game.cpp.

6886{
6887 std::map<std::string, map_item_stack> temp_items;
6888 std::vector<map_item_stack> ret;
6889 std::vector<std::string> item_order;
6890
6891 if( u.is_blind() ) {
6892 return ret;
6893 }
6894
6895 int range = fov_3d ? ( fov_3d_z_range * 2 ) + 1 : 1;
6896 int center_z = u.pos().z;
6897
6898 for( int i = 1; i <= range; i++ ) {
6899 int z = i % 2 ? center_z - i / 2 : center_z + i / 2;
6900 for( auto &points_p_it : closest_points_first( {u.pos().xy(), z}, iRadius ) ) {
6901 if( points_p_it.y >= u.posy() - iRadius && points_p_it.y <= u.posy() + iRadius &&
6902 u.sees( points_p_it ) &&
6903 m.sees_some_items( points_p_it, u ) ) {
6904
6905 for( auto &elem : m.i_at( points_p_it ) ) {
6906 const std::string name = elem.tname();
6907 const tripoint relative_pos = points_p_it - u.pos();
6908
6909 if( std::find( item_order.begin(), item_order.end(), name ) == item_order.end() ) {
6910 item_order.push_back( name );
6911 temp_items[name] = map_item_stack( &elem, relative_pos );
6912 } else {
6913 temp_items[name].add_at_pos( &elem, relative_pos );
6914 }
6915 }
6916 }
6917 }
6918 }
6919
6920 for( auto &elem : item_order ) {
6921 ret.push_back( temp_items[elem] );
6922 }
6923
6924 return ret;
6925}
int fov_3d_z_range
3D FoV range, in Z levels, in both directions.
bool fov_3d
3D FoV enabled/disabled.
bool is_blind() const
Returns true if the player isn't able to see.
Definition: character.cpp:6254
std::vector< coords::coord_point< Point, Origin, Scale > > closest_points_first(const coords::coord_point< Point, Origin, Scale > &loc, int min_dist, int max_dist)
Definition: coordinates.h:596

References closest_points_first(), detail::find(), fov_3d, fov_3d_z_range, map::i_at(), Character::is_blind(), m, om_direction::name(), Character::pos(), Character::posy(), cata::hash64_detail::ret, Character::sees(), map::sees_some_items(), u, and tripoint::z.

Referenced by list_items_monsters().

◆ find_npc()

npc * game::find_npc ( character_id  id)

Find the npc with the given ID.

Returns NULL if the npc could not be found. Searches all loaded overmaps.

Definition at line 1866 of file game.cpp.

1867{
1868 return overmap_buffer.find_npc( id ).get();
1869}

References overmapbuffer::find_npc(), and overmap_buffer.

Referenced by critter_by_id().

◆ find_or_make_stairs()

cata::optional< tripoint > game::find_or_make_stairs ( map mp,
int  z_after,
bool &  rope_ladder,
bool  peeking 
)

Returns the other end of the stairs (if any).

May query, affect u etc.

Definition at line 10375 of file game.cpp.

10377{
10378 const int omtilesz = SEEX * 2;
10379 real_coords rc( m.getabs( point( u.posx(), u.posy() ) ) );
10380 tripoint omtile_align_start( m.getlocal( rc.begin_om_pos() ), z_after );
10381 tripoint omtile_align_end( omtile_align_start + point( -1 + omtilesz, -1 + omtilesz ) );
10382
10383 // Try to find the stairs.
10385 int best = INT_MAX;
10386 const int movez = z_after - get_levz();
10387 const bool going_down_1 = movez == -1;
10388 const bool going_up_1 = movez == 1;
10389 // If there are stairs on the same x and y as we currently are, use those
10390 if( going_down_1 && mp.has_flag( TFLAG_GOES_UP, u.pos() + tripoint_below ) ) {
10391 stairs.emplace( u.pos() + tripoint_below );
10392 }
10393 if( going_up_1 && mp.has_flag( TFLAG_GOES_DOWN, u.pos() + tripoint_above ) ) {
10394 stairs.emplace( u.pos() + tripoint_above );
10395 }
10396 // We did not find stairs directly above or below, so search the map for them
10397 if( !stairs.has_value() ) {
10398 for( const tripoint &dest : m.points_in_rectangle( omtile_align_start, omtile_align_end ) ) {
10399 if( rl_dist( u.pos(), dest ) <= best &&
10400 ( ( going_down_1 && mp.has_flag( TFLAG_GOES_UP, dest ) ) ||
10401 ( going_up_1 && ( mp.has_flag( TFLAG_GOES_DOWN, dest ) ||
10402 mp.ter( dest ) == t_manhole_cover ) ) ||
10403 ( ( movez == 2 || movez == -2 ) && mp.ter( dest ) == t_elevator ) ) ) {
10404 stairs.emplace( dest );
10405 best = rl_dist( u.pos(), dest );
10406 }
10407 }
10408 }
10409
10410 if( stairs.has_value() ) {
10411 if( Creature *blocking_creature = critter_at( stairs.value() ) ) {
10412 npc *guy = dynamic_cast<npc *>( blocking_creature );
10413 monster *mon = dynamic_cast<monster *>( blocking_creature );
10414 bool would_move = ( guy && !guy->is_enemy() ) || ( mon && mon->friendly == -1 );
10415 bool can_displace = find_empty_spot_nearby( *stairs ).has_value();
10416 std::string cr_name = blocking_creature->get_name();
10417 std::string msg;
10418 if( guy ) {
10419 //~ %s is the name of hostile NPC
10420 msg = string_format( _( "%s is in the way!" ), cr_name );
10421 } else {
10422 //~ %s is some monster
10423 msg = string_format( _( "There's a %s in the way!" ), cr_name );
10424 }
10425
10426 if( ( peeking && !would_move ) || !can_displace || ( !would_move && !query_yn(
10427 //~ %s is a warning about monster/hostile NPC in the way, e.g. "There's a zombie in the way!"
10428 _( "%s Attempt to push past? You may have to fight your way back up." ), msg ) ) ) {
10429 add_msg( msg );
10430 return cata::nullopt;
10431 }
10432 }
10433 return stairs;
10434 }
10435
10436 // No stairs found! Try to make some
10437 rope_ladder = false;
10438 stairs.emplace( u.pos() );
10439 stairs->z = z_after;
10440 // Check the destination area for lava.
10441 if( mp.ter( *stairs ) == t_lava ) {
10442 if( movez < 0 &&
10443 !query_yn(
10444 _( "There is a LOT of heat coming out of there, even the stairs have melted away. Jump down? You won't be able to get back up." ) ) ) {
10445 return cata::nullopt;
10446 } else if( movez > 0 &&
10447 !query_yn(
10448 _( "There is a LOT of heat coming out of there. Push through the half-molten rocks and ascend? You will not be able to get back down." ) ) ) {
10449 return cata::nullopt;
10450 }
10451
10452 return stairs;
10453 }
10454
10455 if( movez > 0 ) {
10456 if( !mp.has_flag( "GOES_DOWN", *stairs ) ) {
10457 if( !query_yn( _( "You may be unable to return back down these stairs. Continue up?" ) ) ) {
10458 return cata::nullopt;
10459 }
10460 }
10461 // Manhole covers need this to work
10462 // Maybe require manhole cover here and fail otherwise?
10463 return stairs;
10464 }
10465
10466 if( mp.impassable( *stairs ) ) {
10467 popup( _( "Halfway down, the way down becomes blocked off." ) );
10468 return cata::nullopt;
10469 }
10470
10471 if( u.has_trait( trait_id( "WEB_RAPPEL" ) ) ) {
10472 if( query_yn( _( "There is a sheer drop halfway down. Web-descend?" ) ) ) {
10473 rope_ladder = true;
10474 if( ( rng( 4, 8 ) ) < u.get_skill_level( skill_dodge ) ) {
10475 add_msg( _( "You attach a web and dive down headfirst, flipping upright and landing on your feet." ) );
10476 } else {
10477 add_msg( _( "You securely web up and work your way down, lowering yourself safely." ) );
10478 }
10479 } else {
10480 return cata::nullopt;
10481 }
10482 } else if( u.has_trait( trait_VINES2 ) || u.has_trait( trait_VINES3 ) ) {
10483 if( query_yn( _( "There is a sheer drop halfway down. Use your vines to descend?" ) ) ) {
10484 if( u.has_trait( trait_VINES2 ) ) {
10485 if( query_yn( _( "Detach a vine? It'll hurt, but you'll be able to climb back up…" ) ) ) {
10486 rope_ladder = true;
10487 add_msg( m_bad, _( "You descend on your vines, though leaving a part of you behind stings." ) );
10488 u.mod_pain( 5 );
10489 u.apply_damage( nullptr, bodypart_id( "torso" ), 5 );
10490 u.mod_stored_nutr( 10 );
10491 u.mod_thirst( 10 );
10492 } else {
10493 add_msg( _( "You gingerly descend using your vines." ) );
10494 }
10495 } else {
10496 add_msg( _( "You effortlessly lower yourself and leave a vine rooted for future use." ) );
10497 rope_ladder = true;
10498 u.mod_stored_nutr( 10 );
10499 u.mod_thirst( 10 );
10500 }
10501 } else {
10502 return cata::nullopt;
10503 }
10504 } else if( u.has_amount( itype_grapnel, 1 ) ) {
10505 if( query_yn( _( "There is a sheer drop halfway down. Climb your grappling hook down?" ) ) ) {
10506 rope_ladder = true;
10508 } else {
10509 return cata::nullopt;
10510 }
10511 } else if( u.has_amount( itype_rope_30, 1 ) ) {
10512 if( query_yn( _( "There is a sheer drop halfway down. Climb your rope down?" ) ) ) {
10513 rope_ladder = true;
10515 } else {
10516 return cata::nullopt;
10517 }
10518 } else if( !query_yn( _( "There is a sheer drop halfway down. Jump?" ) ) ) {
10519 return cata::nullopt;
10520 }
10521
10522 return stairs;
10523}
int_id< body_part_type > bodypart_id
Definition: bodypart.h:23
void mod_pain(int npain) override
Modifies a pain value by player traits before passing it to Creature::mod_pain()
Definition: character.cpp:884
void apply_damage(Creature *source, bodypart_id hurt, int dam, bool bypass_med=false) override
Actually hurt the player, hurts a body_part directly, no armor reduction.
Definition: character.cpp:8312
std::list< item > use_amount(itype_id it, int quantity, const std::function< bool(const item &)> &filter=return_true< item >)
Definition: character.cpp:9536
virtual void mod_thirst(int nthirst)
Definition: character.cpp:4426
virtual void mod_stored_nutr(int nnutr)
Definition: character.cpp:4316
int get_skill_level(const skill_id &ident) const
Definition: character.cpp:3413
T & emplace(Args &&... args)
Definition: optional.h:146
constexpr bool has_value() const noexcept
Definition: optional.h:123
tripoint getlocal(const tripoint &p) const
Inverse of getabs.
Definition: map.cpp:8280
bool impassable(const tripoint &p) const
Definition: map.cpp:1795
tripoint_range< tripoint > points_in_rectangle(const tripoint &from, const tripoint &to) const
Definition: map.cpp:8609
bool is_enemy() const
Definition: npc.cpp:2043
static const trait_id trait_VINES2("VINES2")
static const skill_id skill_dodge("dodge")
static cata::optional< tripoint > find_empty_spot_nearby(const tripoint &pos)
Definition: game.cpp:9911
static const itype_id itype_rope_30("rope_30")
static const itype_id itype_grapnel("grapnel")
static const trait_id trait_VINES3("VINES3")
ter_id t_manhole_cover
Definition: mapdata.cpp:722
ter_id t_lava
Definition: mapdata.cpp:697
ter_id t_elevator
Definition: mapdata.cpp:725
@ TFLAG_GOES_DOWN
Definition: mapdata.h:308
@ TFLAG_GOES_UP
Definition: mapdata.h:309
static constexpr nullopt_t nullopt
Definition: optional.h:22
static constexpr tripoint tripoint_below
Definition: point.h:295
static constexpr tripoint tripoint_above
Definition: point.h:294

References _, add_msg(), Character::apply_damage(), real_coords::begin_om_pos(), critter_at(), cata::optional< T >::emplace(), find_empty_spot_nearby(), monster::friendly, get_levz(), Character::get_skill_level(), map::getabs(), map::getlocal(), visitable< T >::has_amount(), map::has_flag(), Character::has_trait(), cata::optional< T >::has_value(), map::impassable(), npc::is_enemy(), itype_grapnel, itype_rope_30, m, m_bad, Character::mod_pain(), Character::mod_stored_nutr(), Character::mod_thirst(), cata::nullopt, map::points_in_rectangle(), popup(), Character::pos(), Character::posx(), Character::posy(), query_yn(), rl_dist(), rng(), SEEX, skill_dodge, string_format(), t_elevator, t_lava, t_manhole_cover, map::ter(), TFLAG_GOES_DOWN, TFLAG_GOES_UP, trait_VINES2, trait_VINES3, tripoint_above, tripoint_below, u, Character::use_amount(), and cata::optional< T >::value().

Referenced by vertical_move().

◆ fling_creature()

void game::fling_creature ( Creature c,
const units::angle dir,
float  flvel,
bool  controlled = false,
bool  suppress_map_update = false 
)

Flings the input creature in the given direction.

Definition at line 9713 of file game.cpp.

9715{
9716 if( c == nullptr ) {
9717 debugmsg( "game::fling_creature invoked on null target" );
9718 return;
9719 }
9720
9721 if( c->is_dead_state() ) {
9722 // Flinging a corpse causes problems, don't enable without testing
9723 return;
9724 }
9725
9726 if( c->is_hallucination() ) {
9727 // Don't fling hallucinations
9728 return;
9729 }
9730
9731 bool thru = true;
9732 const bool is_u = ( c == &u );
9733 // Don't animate critters getting bashed if animations are off
9734 const bool animate = is_u || get_option<bool>( "ANIMATIONS" );
9735
9736 player *p = dynamic_cast<player *>( c );
9737
9738 tileray tdir( dir );
9739 int range = flvel / 10;
9740 tripoint pt = c->pos();
9741 tripoint prev_point = pt;
9742 bool force_next = false;
9743 tripoint next_forced;
9744 while( range > 0 ) {
9745 c->set_underwater( false );
9746 // TODO: Check whenever it is actually in the viewport
9747 // or maybe even just redraw the changed tiles
9748 bool seen = is_u || u.sees( *c ); // To avoid redrawing when not seen
9749 if( force_next ) {
9750 pt = next_forced;
9751 force_next = false;
9752 } else {
9753 tdir.advance();
9754 pt.x = c->posx() + tdir.dx();
9755 pt.y = c->posy() + tdir.dy();
9756 }
9757 float force = 0;
9758
9759 if( m.obstructed_by_vehicle_rotation( prev_point, pt ) ) {
9760 //We process the intervening tile on this iteration and then the current tile on the next
9761 next_forced = pt;
9762 force_next = true;
9763 if( one_in( 2 ) ) {
9764 pt.x = prev_point.x;
9765 } else {
9766 pt.y = prev_point.y;
9767 }
9768 }
9769
9770
9771 if( monster *const mon_ptr = critter_at<monster>( pt ) ) {
9772 monster &critter = *mon_ptr;
9773 // Approximate critter's "stopping power" with its max hp
9774 force = std::min<float>( 1.5f * critter.type->hp, flvel );
9775 const int damage = rng( force, force * 2.0f ) / 6;
9776 c->impact( damage, pt );
9777 // Multiply zed damage by 6 because no body parts
9778 const int zed_damage = std::max( 0,
9779 ( damage - critter.get_armor_bash( bodypart_id( "torso" ) ) ) * 6 );
9780 // TODO: Pass the "flinger" here - it's not the flung critter that deals damage
9781 critter.apply_damage( c, bodypart_id( "torso" ), zed_damage );
9782 critter.check_dead_state();
9783 if( !critter.is_dead() ) {
9784 thru = false;
9785 }
9786 } else if( m.impassable( pt ) ) {
9787 if( !m.veh_at( pt ).obstacle_at_part() ) {
9788 force = std::min<float>( m.bash_strength( pt ), flvel );
9789 } else {
9790 // No good way of limiting force here
9791 // Keep it 1 less than maximum to make the impact hurt
9792 // but to keep the target flying after it
9793 force = flvel - 1;
9794 }
9795 const int damage = rng( force, force * 2.0f ) / 9;
9796 c->impact( damage, pt );
9797 if( m.is_bashable( pt ) ) {
9798 // Only go through if we successfully make the tile passable
9799 m.bash( pt, flvel );
9800 thru = m.passable( pt );
9801 } else {
9802 thru = false;
9803 }
9804 }
9805
9806 // If the critter dies during flinging, moving it around causes debugmsgs
9807 if( c->is_dead_state() ) {
9808 return;
9809 }
9810
9811 flvel -= force;
9812 if( thru ) {
9813 if( p != nullptr ) {
9814 if( p->in_vehicle ) {
9815 m.unboard_vehicle( p->pos() );
9816 }
9817 // If we're flinging the player around, make sure the map stays centered on them.
9818 if( is_u && !suppress_map_update ) {
9819 update_map( pt.x, pt.y );
9820 } else {
9821 p->setpos( pt );
9822 }
9823 } else if( !critter_at( pt ) ) {
9824 // Dying monster doesn't always leave an empty tile (blob spawning etc.)
9825 // Just don't setpos if it happens - next iteration will do so
9826 // or the monster will stop a tile before the unpassable one
9827 c->setpos( pt );
9828 }
9829 } else {
9830 // Don't zero flvel - count this as slamming both the obstacle and the ground
9831 // although at lower velocity
9832 break;
9833 }
9834 //Vehicle wall tiles don't count for range
9835 if( !force_next ) {
9836 range--;
9837 }
9838 prev_point = pt;
9839 if( animate && ( seen || u.sees( *c ) ) ) {
9844 }
9845 }
9846
9847 // Fall down to the ground - always on the last reached tile
9848 if( !m.has_flag( "SWIMMABLE", c->pos() ) ) {
9849 const trap_id trap_under_creature = m.tr_at( c->pos() ).loadid;
9850 // Didn't smash into a wall or a floor so only take the fall damage
9851 if( thru && trap_under_creature == tr_ledge ) {
9852 m.creature_on_trap( *c, false );
9853 } else {
9854 // Fall on ground
9855 int force = rng( flvel, flvel * 2 ) / 9;
9856 if( controlled ) {
9857 force = std::max( force / 2 - 5, 0 );
9858 }
9859 if( force > 0 ) {
9860 int dmg = c->impact( force, c->pos() );
9861 // TODO: Make landing damage the floor
9862 m.bash( c->pos(), dmg / 4, false, false, false );
9863 }
9864 // Always apply traps to creature i.e. bear traps, tele traps etc.
9865 m.creature_on_trap( *c, false );
9866 }
9867 } else {
9868 c->set_underwater( true );
9869 if( is_u ) {
9870 if( controlled ) {
9871 add_msg( _( "You dive into water." ) );
9872 } else {
9873 add_msg( m_warning, _( "You fall into water." ) );
9874 }
9875 }
9876 }
9877}
void setpos(const tripoint &p) override
Definition: character.h:831
void check_dead_state()
This function checks the creatures is_dead_state and (if true) calls die.
Definition: creature.cpp:1844
point update_map(player &p)
Definition: game.cpp:10602
void pump_events()
Resize & refresh if necessary, process all pending window events, and ignore keypresses.
int bash_strength(const tripoint &p, bool allow_floor=false) const
Returns max_str of the furniture or terrain at p.
Definition: map.cpp:2460
bool obstructed_by_vehicle_rotation(const tripoint &from, const tripoint &to) const
Checks if a rotated vehicle is blocking diagonal movement, tripoints must be adjacent.
Definition: map.cpp:6497
bash_results bash(const tripoint &p, int str, bool silent=false, bool destroy=false, bool bash_floor=false, const vehicle *bashing_vehicle=nullptr)
Returns a pair where first is whether anything was smashed and second is if it was destroyed.
Definition: map.cpp:3527
void unboard_vehicle(const vpart_reference &, Character *passenger, bool dead_passenger=false)
Definition: map.cpp:1081
bool is_bashable(const tripoint &p, bool allow_floor=false) const
Returns true if there is a bashable vehicle part or the furn/terrain is bashable at p.
Definition: map.cpp:2425
void creature_on_trap(Creature &critter, bool may_avoid=true)
Apply trap effects to the creature, similar to creature_in_field.
Definition: map.cpp:8486
bool passable(const tripoint &p) const
Definition: map.cpp:1800
int get_armor_bash(bodypart_id bp) const override
Definition: monster.cpp:1879
bool is_dead() const
Definition: monster.cpp:2777
void apply_damage(Creature *source, bodypart_id bp, int dam, bool bypass_med=false) override
Definition: monster.cpp:1660
cata::optional< vpart_reference > obstacle_at_part() const
Definition: vehicle.cpp:2493
static const trap_str_id tr_ledge("tr_ledge")
void redraw_invalidated()
Redraw all invalidated windows without invalidating the top window.
Definition: ui_manager.cpp:394
int hp
Definition: mtype.h:270
trap_id loadid
Definition: trap.h:88
int y
Definition: point.h:151
int x
Definition: point.h:150

References _, add_msg(), tileray::advance(), monster::apply_damage(), map::bash(), map::bash_strength(), c, Creature::check_dead_state(), map::creature_on_trap(), critter_at(), debugmsg, tileray::dx(), tileray::dy(), monster::get_armor_bash(), map::has_flag(), mtype::hp, map::impassable(), Character::in_vehicle, inp_mngr, invalidate_main_ui_adaptor(), map::is_bashable(), monster::is_dead(), trap::loadid, m, m_warning, optional_vpart_position::obstacle_at_part(), map::obstructed_by_vehicle_rotation(), one_in(), map::passable(), Character::pos(), input_manager::pump_events(), ui_manager::redraw_invalidated(), refresh_display(), rng(), Character::sees(), Character::setpos(), map::tr_at(), tr_ledge, monster::type, u, map::unboard_vehicle(), update_map(), map::veh_at(), tripoint::x, and tripoint::y.

Referenced by moving_vehicle_dismount().

◆ forced_door_closing()

bool game::forced_door_closing ( const tripoint p,
const ter_id door_type,
int  bash_dmg 
)

Definition at line 4966 of file game.cpp.

4967{
4968 const auto valid_location = [&]( const tripoint & p ) {
4969 return g->is_empty( p );
4970 };
4971 const auto get_random_point = [&]() -> tripoint {
4972 if( auto pos = random_point( m.points_in_radius( p, 2 ), valid_location ) )
4973 {
4974 return p * 2 - ( *pos );
4975 } else
4976 {
4977 return p;
4978 }
4979 };
4980
4981 const std::string &door_name = door_type.obj().name();
4982 const tripoint kbp = get_random_point();
4983
4984 // can't pushback any creatures/items anywhere, that means the door can't close.
4985 const bool cannot_push = kbp == p;
4986 const bool can_see = u.sees( p );
4987
4988 player *npc_or_player = critter_at<player>( p, false );
4989 if( npc_or_player != nullptr ) {
4990 if( bash_dmg <= 0 ) {
4991 return false;
4992 }
4993 if( npc_or_player->is_npc() && can_see ) {
4994 add_msg( _( "The %1$s hits the %2$s." ), door_name, npc_or_player->name );
4995 } else if( npc_or_player->is_player() ) {
4996 add_msg( m_bad, _( "The %s hits you." ), door_name );
4997 }
4998 if( npc_or_player->activity ) {
4999 npc_or_player->cancel_activity();
5000 }
5001 // TODO: make the npc angry?
5002 npc_or_player->hitall( bash_dmg, 0, nullptr );
5003 if( cannot_push ) {
5004 return false;
5005 }
5006 // TODO implement who was closing the door and replace nullptr
5007 knockback( kbp, p, std::max( 1, bash_dmg / 10 ), -1, 1, nullptr );
5008 // TODO: perhaps damage/destroy the gate
5009 // if the npc was really big?
5010 }
5011 if( monster *const mon_ptr = critter_at<monster>( p ) ) {
5012 monster &critter = *mon_ptr;
5013 if( bash_dmg <= 0 ) {
5014 return false;
5015 }
5016 if( can_see ) {
5017 add_msg( _( "The %1$s hits the %2$s." ), door_name, critter.name() );
5018 }
5019 if( critter.type->size <= MS_SMALL ) {
5020 critter.die_in_explosion( nullptr );
5021 } else {
5022 critter.apply_damage( nullptr, bodypart_id( "torso" ), bash_dmg );
5023 critter.check_dead_state();
5024 }
5025 if( !critter.is_dead() && critter.type->size >= MS_HUGE ) {
5026 // big critters simply prevent the gate from closing
5027 // TODO: perhaps damage/destroy the gate
5028 // if the critter was really big?
5029 return false;
5030 }
5031 if( !critter.is_dead() ) {
5032 // Still alive? Move the critter away so the door can close
5033 if( cannot_push ) {
5034 return false;
5035 }
5036 // TODO implement who was closing the door and replace nullptr
5037 knockback( kbp, p, std::max( 1, bash_dmg / 10 ), -1, 1, nullptr );
5038 if( critter_at( p ) ) {
5039 return false;
5040 }
5041 }
5042 }
5043 if( const optional_vpart_position vp = m.veh_at( p ) ) {
5044 if( bash_dmg <= 0 ) {
5045 return false;
5046 }
5047 vp->vehicle().damage( vp->part_index(), bash_dmg );
5048 if( m.veh_at( p ) ) {
5049 // Check again in case all parts at the door tile
5050 // have been destroyed, if there is still a vehicle
5051 // there, the door can not be closed
5052 return false;
5053 }
5054 }
5055 if( bash_dmg < 0 && !m.i_at( p ).empty() ) {
5056 return false;
5057 }
5058 if( bash_dmg == 0 ) {
5059 for( auto &elem : m.i_at( p ) ) {
5060 if( elem.made_of( LIQUID ) ) {
5061 // Liquids are OK, will be destroyed later
5062 continue;
5063 } else if( elem.volume() < 250_ml ) {
5064 // Dito for small items, will be moved away
5065 continue;
5066 }
5067 // Everything else prevents the door from closing
5068 return false;
5069 }
5070 }
5071
5072 m.ter_set( p, door_type );
5073 if( m.has_flag( "NOITEM", p ) ) {
5074 map_stack items = m.i_at( p );
5075 for( map_stack::iterator it = items.begin(); it != items.end(); ) {
5076 if( it->made_of( LIQUID ) ) {
5077 it = items.erase( it );
5078 continue;
5079 }
5080 if( it->made_of( material_id( "glass" ) ) && one_in( 2 ) ) {
5081 if( can_see ) {
5082 add_msg( m_warning, _( "A %s shatters!" ), it->tname() );
5083 } else {
5084 add_msg( m_warning, _( "Something shatters!" ) );
5085 }
5086 it = items.erase( it );
5087 continue;
5088 }
5089 if( cannot_push ) {
5090 return false;
5091 }
5092 m.add_item_or_charges( kbp, *it );
5093 it = items.erase( it );
5094 }
5095 }
5096 return true;
5097}
int hitall(int dam, int vary, Creature *source)
Harms all body parts for dam, with armor reduction.
Definition: character.cpp:8589
void knockback(const tripoint &s, const tripoint &t, int force, int stun, int dam_mult, Creature *source)
Definition: game.cpp:4222
iterator erase(const_iterator it) override
Definition: map.cpp:152
bool ter_set(const tripoint &p, const ter_id &new_terrain)
Definition: map.cpp:1639
void die_in_explosion(Creature *source)
Definition: monster.cpp:1674
bool is_npc() const override
Definition: player.h:109
bool is_player() const override
Definition: player.h:99
@ MS_SMALL
Definition: creature.h:59
@ MS_HUGE
Definition: creature.h:62
@ LIQUID
Definition: enums.h:175
cata::optional< tripoint > random_point(const map &m, const std::function< bool(const tripoint &)> &predicate)
Same as other random_point with a range enclosing all valid points of the map.
std::string name() const
Definition: mapdata.cpp:513
m_size size
Definition: mtype.h:262

References _, Character::activity, map::add_item_or_charges(), add_msg(), monster::apply_damage(), item_stack::begin(), Character::cancel_activity(), Creature::check_dead_state(), critter_at(), monster::die_in_explosion(), item_stack::empty(), item_stack::end(), map_stack::erase(), g, map::has_flag(), Character::hitall(), map::i_at(), monster::is_dead(), player::is_npc(), player::is_player(), knockback(), LIQUID, m, m_bad, m_warning, MS_HUGE, MS_SMALL, Character::name, map_data_common_t::name(), monster::name(), int_id< T >::obj(), one_in(), map::points_in_radius(), random_point(), Character::sees(), mtype::size, map::ter_set(), monster::type, u, and map::veh_at().

◆ gametype()

special_game_id game::gametype ( ) const

Definition at line 531 of file game.cpp.

532{
533 return gamemode ? gamemode->id() : SGAME_NULL;
534}
@ SGAME_NULL
Definition: enums.h:93

References gamemode, and SGAME_NULL.

◆ get_creature_if()

Creature * game::get_creature_if ( const std::function< bool(const Creature &)> &  pred)

Returns a creature matching a predicate.

Only living (not dead) creatures are checked. Returns nullptr if no creature matches the predicate. There is no guarantee which creature is returned when several creatures match.

Definition at line 11951 of file game.cpp.

11952{
11953 for( Creature &critter : all_creatures() ) {
11954 if( pred( critter ) ) {
11955 return &critter;
11956 }
11957 }
11958 return nullptr;
11959}

References all_creatures().

◆ get_creatures_if()

std::vector< Creature * > game::get_creatures_if ( const std::function< bool(const Creature &)> &  pred)

Returns all creatures matching a predicate.

Only living ( not dead ) creatures are checked ( and returned ). Returned pointers are never null.

Definition at line 11861 of file game.cpp.

11863{
11864 std::vector<Creature *> result;
11865 for( Creature &critter : all_creatures() ) {
11866 if( pred( critter ) ) {
11867 result.push_back( &critter );
11868 }
11869 }
11870 return result;
11871}

References all_creatures().

◆ get_cur_om()

overmap & game::get_cur_om ( ) const

The overmap which contains the center submap of the reality bubble.

Definition at line 11841 of file game.cpp.

11842{
11843 // The player is located in the middle submap of the map.
11845 const tripoint pos_om = sm_to_om_copy( sm );
11846 // TODO: fix point types
11847 return overmap_buffer.get( point_abs_om( pos_om.xy() ) );
11848}
tripoint get_abs_sub() const
return abs_sub
Definition: map.cpp:8290
overmap & get(const point_abs_om &)
Uses overmap coordinates, that means x and y are directly compared with the position of the overmap.
point sm_to_om_copy(const point &p)
coords::coord_point< point, coords::origin::abs, coords::om > point_abs_om
Definition: coordinates.h:483
static constexpr int HALF_MAPSIZE
constexpr scale sm
Definition: coordinates.h:31

References overmapbuffer::get(), map::get_abs_sub(), HALF_MAPSIZE, m, overmap_buffer, coords::sm, sm_to_om_copy(), and tripoint::xy().

Referenced by start_game().

◆ get_dangerous_tile()

std::vector< std::string > game::get_dangerous_tile ( const tripoint dest_loc) const

Definition at line 8670 of file game.cpp.

8671{
8672 std::vector<std::string> harmful_stuff;
8673 const auto fields_here = m.field_at( u.pos() );
8674 for( const auto &e : m.field_at( dest_loc ) ) {
8675 // warn before moving into a dangerous field except when already standing within a similar field
8676 if( u.is_dangerous_field( e.second ) && fields_here.find_field( e.first ) == nullptr ) {
8677 harmful_stuff.push_back( e.second.name() );
8678 }
8679 }
8680
8681 if( !u.is_blind() ) {
8682 const trap &tr = m.tr_at( dest_loc );
8683 const bool boardable = static_cast<bool>( m.veh_at( dest_loc ).part_with_feature( "BOARDABLE",
8684 true ) );
8685 // HACK: Hack for now, later ledge should stop being a trap
8686 // Note: in non-z-level mode, ledges obey different rules and so should be handled as regular traps
8687 if( tr.loadid == tr_ledge && m.has_zlevels() ) {
8688 if( !boardable ) {
8689 harmful_stuff.emplace_back( tr.name() );
8690 }
8691 } else if( tr.can_see( dest_loc, u ) && !tr.is_benign() && !boardable ) {
8692 harmful_stuff.emplace_back( tr.name() );
8693 }
8694
8695 static const std::set< body_part > sharp_bps = {
8698 };
8699
8700 const auto sharp_bp_check = [this]( body_part bp ) {
8701 return u.immune_to( bp, { DT_CUT, 10 } );
8702 };
8703
8704 if( m.has_flag( "ROUGH", dest_loc ) && !m.has_flag( "ROUGH", u.pos() ) && !boardable &&
8705 ( u.get_armor_bash( bodypart_id( "foot_l" ) ) < 5 ||
8706 u.get_armor_bash( bodypart_id( "foot_r" ) ) < 5 ) ) {
8707 harmful_stuff.emplace_back( m.name( dest_loc ) );
8708 } else if( m.has_flag( "SHARP", dest_loc ) && !m.has_flag( "SHARP", u.pos() ) && !( u.in_vehicle ||
8709 m.veh_at( dest_loc ) ) &&
8710 u.dex_cur < 78 && !std::all_of( sharp_bps.begin(), sharp_bps.end(), sharp_bp_check ) ) {
8711 harmful_stuff.emplace_back( m.name( dest_loc ) );
8712 }
8713
8714 }
8715
8716 return harmful_stuff;
8717}
@ bp_foot_l
Definition: bodypart.h:50
@ bp_leg_r
Definition: bodypart.h:49
@ bp_eyes
Definition: bodypart.h:42
@ bp_hand_l
Definition: bodypart.h:46
@ bp_arm_l
Definition: bodypart.h:44
@ bp_leg_l
Definition: bodypart.h:48
@ bp_hand_r
Definition: bodypart.h:47
@ bp_head
Definition: bodypart.h:41
@ bp_torso
Definition: bodypart.h:40
@ bp_mouth
Definition: bodypart.h:43
@ bp_foot_r
Definition: bodypart.h:51
@ bp_arm_r
Definition: bodypart.h:45
int dex_cur
Definition: character.h:266
int get_armor_bash(bodypart_id bp) const override
Returns overall bashing resistance for the body_part.
Definition: character.cpp:6883
bool is_dangerous_field(const field_entry &entry) const
Returns true if the given field entry is dangerous to us.
Definition: creature.cpp:201
const field & field_at(const tripoint &p) const
Get the fields that are here.
Definition: map.cpp:5301
bool has_zlevels() const
Definition: map.h:1684
cata::optional< vpart_reference > part_with_feature(const std::string &f, bool unbroken) const
Definition: vehicle.cpp:2481
bool immune_to(body_part bp, damage_unit dam) const
Check if a given body part is immune to a given damage type.
Definition: player.cpp:350
@ DT_CUT
Definition: damage.h:25
Definition: trap.h:86
std::string name() const
Definition: trap.cpp:177
bool can_see(const tripoint &pos, const Character &p) const
Can player/npc p see this kind of trap, either by their memory (they known there is the trap) or by t...
Definition: trap.cpp:223
bool is_benign() const
If true, this is not really a trap and there won't be any safety queries before stepping onto it (e....
Definition: trap.h:159

References bp_arm_l, bp_arm_r, bp_eyes, bp_foot_l, bp_foot_r, bp_hand_l, bp_hand_r, bp_head, bp_leg_l, bp_leg_r, bp_mouth, bp_torso, trap::can_see(), Character::dex_cur, DT_CUT, map::field_at(), Character::get_armor_bash(), map::has_flag(), map::has_zlevels(), player::immune_to(), Character::in_vehicle, trap::is_benign(), Character::is_blind(), Creature::is_dangerous_field(), trap::loadid, m, trap::name(), map::name(), optional_vpart_position::part_with_feature(), Character::pos(), map::tr_at(), tr_ledge, u, and map::veh_at().

Referenced by is_dangerous_tile(), prompt_dangerous_tile(), and walk_move().

◆ get_fishable_locations()

std::unordered_set< tripoint > game::get_fishable_locations ( int  distance,
const tripoint fish_pos 
)

Get the contiguous fishable locations starting at fish_pos, out to the specificed distance.

Parameters
distanceDistance around the fish_pos to examine for contiguous fishable locations.
fish_posThe location being fished.
Returns
A set of locations representing the valid contiguous fishable locations.

Definition at line 3581 of file game.cpp.

3582{
3583 // We're going to get the contiguous fishable terrain starting at
3584 // the provided fishing location (e.g. where a line was cast or a fish
3585 // trap was set), and then check whether or not fishable monsters are
3586 // actually in those locations. This will help us ensure that we're
3587 // getting our fish from the location that we're ACTUALLY fishing,
3588 // rather than just somewhere in the vicinity.
3589
3590 std::unordered_set<tripoint> visited;
3591
3592 const tripoint fishing_boundary_min( fish_pos + point( -distance, -distance ) );
3593 const tripoint fishing_boundary_max( fish_pos + point( distance, distance ) );
3594
3595 const inclusive_cuboid<tripoint> fishing_boundaries(
3596 fishing_boundary_min, fishing_boundary_max );
3597
3598 const auto get_fishable_terrain = [&]( tripoint starting_point,
3599 std::unordered_set<tripoint> &fishable_terrain ) {
3600 std::queue<tripoint> to_check;
3601 to_check.push( starting_point );
3602 while( !to_check.empty() ) {
3603 const tripoint current_point = to_check.front();
3604 to_check.pop();
3605
3606 // We've been here before, so bail.
3607 if( visited.find( current_point ) != visited.end() ) {
3608 continue;
3609 }
3610
3611 // This point is out of bounds, so bail.
3612 if( !fishing_boundaries.contains( current_point ) ) {
3613 continue;
3614 }
3615
3616 // Mark this point as visited.
3617 visited.emplace( current_point );
3618
3619 if( m.has_flag( "FISHABLE", current_point ) ) {
3620 fishable_terrain.emplace( current_point );
3621 to_check.push( current_point + point_south );
3622 to_check.push( current_point + point_north );
3623 to_check.push( current_point + point_east );
3624 to_check.push( current_point + point_west );
3625 }
3626 }
3627 return;
3628 };
3629
3630 // Starting at the provided location, get our fishable terrain
3631 // and populate a set with those locations which we'll then use
3632 // to determine if any fishable monsters are in those locations.
3633 std::unordered_set<tripoint> fishable_points;
3634 get_fishable_terrain( fish_pos, fishable_points );
3635
3636 return fishable_points;
3637}
static constexpr point point_west
Definition: point.h:282
static constexpr point point_south
Definition: point.h:280
static constexpr point point_north
Definition: point.h:276
static constexpr point point_east
Definition: point.h:278

References inclusive_cuboid< Tripoint, >::contains(), map::has_flag(), m, point_east, point_north, point_south, and point_west.

◆ get_fishable_monsters()

std::vector< monster * > game::get_fishable_monsters ( std::unordered_set< tripoint > &  fishable_locations)

Get the fishable monsters within the provided fishable locations.

Parameters
fishable_locationsA set of locations which are valid fishable terrain. Any fishable monsters are filtered by this collection to determine those which can actually be caught.
Returns
Fishable monsters within the specified fishable terrain.

Definition at line 3639 of file game.cpp.

3641{
3642 std::vector<monster *> unique_fish;
3643 for( monster &critter : all_monsters() ) {
3644 // If it is fishable...
3645 if( critter.has_flag( MF_FISHABLE ) ) {
3646 const tripoint critter_pos = critter.pos();
3647 // ...and it is in a fishable location.
3648 if( fishable_locations.find( critter_pos ) != fishable_locations.end() ) {
3649 unique_fish.push_back( &critter );
3650 }
3651 }
3652 }
3653
3654 return unique_fish;
3655}
@ MF_FISHABLE
Definition: mtype.h:142

References all_monsters(), and MF_FISHABLE.

◆ get_follower_list()

std::set< character_id > game::get_follower_list ( )

Get set of followers.

Definition at line 1963 of file game.cpp.

1964{
1965 return follower_ids;
1966}

References follower_ids.

◆ get_kill_tracker()

const kill_tracker & game::get_kill_tracker ( ) const

Definition at line 872 of file game.cpp.

873{
874 return *kill_tracker_ptr;
875}

References kill_tracker_ptr.

Referenced by cleanup_at_end(), death_screen(), handle_action(), and win().

◆ get_levx()

int game::get_levx ( ) const

The top left corner of the reality bubble (in submaps coordinates).

This is the same as map::abs_sub of the m map.

Definition at line 11826 of file game.cpp.

11827{
11828 return m.get_abs_sub().x;
11829}

References map::get_abs_sub(), m, and tripoint::x.

Referenced by create_starting_npcs(), load_npcs(), look_around(), save_cyborg(), spawn_hallucination(), vertical_move(), and vertical_shift().

◆ get_levy()

int game::get_levy ( ) const

Definition at line 11831 of file game.cpp.

11832{
11833 return m.get_abs_sub().y;
11834}

References map::get_abs_sub(), m, and tripoint::y.

Referenced by create_starting_npcs(), load_npcs(), look_around(), save_cyborg(), spawn_hallucination(), vertical_move(), and vertical_shift().

◆ get_levz()

◆ get_moves_since_last_save()

int game::get_moves_since_last_save ( ) const

Definition at line 7061 of file game.cpp.

7062{
7063 return moves_since_last_save;
7064}

References moves_since_last_save.

◆ get_npcs_if()

std::vector< npc * > game::get_npcs_if ( const std::function< bool(const npc &)> &  pred)

Definition at line 11873 of file game.cpp.

11874{
11875 std::vector<npc *> result;
11876 for( npc &guy : all_npcs() ) {
11877 if( pred( guy ) ) {
11878 result.push_back( &guy );
11879 }
11880 }
11881 return result;
11882}

References all_npcs().

Referenced by allies(), chat(), and validate_npc_followers().

◆ get_player_base_save_path()

std::string game::get_player_base_save_path ( ) const

Base path for saving player data.

Just add a suffix (unique for the thing you want to save) and use the resulting path. Example: save_ui_data(get_player_base_save_path()+".ui")

Definition at line 11961 of file game.cpp.

11962{
11963 return get_world_base_save_path() + "/" + base64_encode( u.name );
11964}
std::string base64_encode(const std::string &str)
std::string get_world_base_save_path() const
Base path for saving world data.
Definition: game.cpp:11966

References base64_encode(), get_world_base_save_path(), Character::name, and u.

Referenced by save_player_data().

◆ get_player_input()

input_context game::get_player_input ( std::string &  action)
private

Definition at line 244 of file handle_action.cpp.

245{
246 input_context ctxt;
247 if( uquit == QUIT_WATCH ) {
248 ctxt = input_context( "DEFAULTMODE" );
249 ctxt.set_iso( true );
250 // The list of allowed actions in death-cam mode in game::handle_action
251 // *INDENT-OFF*
252 for( const action_id id : {
265 } ) {
266 ctxt.register_action( action_ident( id ) );
267 }
268 // *INDENT-ON*
269 ctxt.register_action( "QUIT", to_translation( "Accept your fate" ) );
270 } else {
272 }
273
275
276 user_turn current_turn;
277
278
279 // Checking early if we will need to handle animations
280 // If we do not need to handle animations that will not change as long as the user has not selected an action
281 // and we can handle it like we are not animating.
282 weather_printable wPrint;
283 bool animate_weather = false;
284 bool animate_sct = false;
285 bool do_animations = [&]() {
286 if( get_option<bool>( "ANIMATIONS" ) ) {
287 const bool weather_has_anim = init_weather_anim( get_weather().weather_id, wPrint );
288
289 animate_weather = weather_has_anim && get_option<bool>( "ANIMATION_RAIN" );
290 animate_sct = !SCT.vSCT.empty() && uquit != QUIT_WATCH && get_option<bool>( "ANIMATION_SCT" );
291
292#if defined(TILES)
293 // Always animate, minimap and terrain may have animations to run
294 return true;
295#else
296 // Otherwise we need to see if we actually should animate.
297 // Minimap and Terrain never animate in !TILES
298 return animate_weather || animate_sct || uquit == QUIT_WATCH;
299#endif
300 }
301 return false;
302 }
303 ();
304
305 if( do_animations ) {
306 ctxt.set_timeout( 125 );
307
309 make_shared_fast<game::draw_callback_t>( [&]() {
310 if( animate_weather ) {
311 draw_weather( wPrint );
312 }
313 if( animate_sct ) {
314 draw_sct();
315 }
316 } );
317 add_draw_callback( animation_cb );
318 invalidate_main_ui_adaptor(); // We want to redraw at least once.
319
320 do {
321 if( animate_weather ) {
323 generate_weather_anim_frame( get_weather().weather_id, wPrint );
324 }
325 // don't bother calculating SCT if we won't show it
326 if( animate_sct ) {
328
330
331 //Check for creatures on all drawing positions and offset if necessary
332 for( auto iter = SCT.vSCT.rbegin(); iter != SCT.vSCT.rend(); ++iter ) {
333 const direction oCurDir = iter->getDirecton();
334 const int width = utf8_width( iter->getText() );
335 for( int i = 0; i < width; ++i ) {
336 tripoint tmp( iter->getPosX() + i, iter->getPosY(), get_levz() );
337 const Creature *critter = critter_at( tmp, true );
338
339 if( critter != nullptr && u.sees( *critter ) ) {
340 i = -1;
341 int iPos = iter->getStep() + iter->getStepOffset();
342 for( auto iter2 = iter; iter2 != SCT.vSCT.rend(); ++iter2 ) {
343 if( iter2->getDirecton() == oCurDir &&
344 iter2->getStep() + iter2->getStepOffset() <= iPos ) {
345 if( iter2->getType() == "hp" ) {
346 iter2->advanceStepOffset();
347 }
348
349 iter2->advanceStepOffset();
350 iPos = iter2->getStep() + iter2->getStepOffset();
351 }
352 }
353 }
354 }
355 }
356
357 // Stop animation when done
358 animate_sct = !SCT.vSCT.empty();
359 }
360 // We don't cache these checks as their result may change after 1st redraw
362 // TODO: we redraw *everything* just to animate a couple blinking dots
363 // on the minimap or a few tiles.
364 // This is far from ideal, and can probably be done much cheaper
365 // (update only part of the screen? draw static parts into a texture?)
367 }
368
369 std::unique_ptr<static_popup> deathcam_msg_popup;
370 if( uquit == QUIT_WATCH ) {
371 deathcam_msg_popup = std::make_unique<static_popup>();
372 deathcam_msg_popup
373 ->wait_message( c_red, _( "Press %s to accept your fate…" ), ctxt.get_desc( "QUIT" ) )
374 .on_top( true );
375 }
376
378 } while( handle_mouseview( ctxt, action ) && uquit != QUIT_WATCH
379 && ( action != "TIMEOUT" || !current_turn.has_timeout_elapsed() ) );
380 ctxt.reset_timeout();
381 } else {
384 SCT.vSCT.clear();
385
386 ctxt.set_timeout( 125 );
387 while( handle_mouseview( ctxt, action ) ) {
388 if( action == "TIMEOUT" && current_turn.has_timeout_elapsed() ) {
389 break;
390 }
391 }
392 ctxt.reset_timeout();
393 }
394
395 return ctxt;
396}
std::string action_ident(action_id act)
Lookup a unique string identifier for a given action ID.
Definition: action.cpp:68
action_id
Enumerates all discrete actions that can be performed by player.
Definition: action.h:22
@ ACTION_CENTER
Center the viewport on character.
Definition: action.h:77
@ ACTION_SHIFT_SW
Move viewport south-west.
Definition: action.h:89
@ ACTION_SHIFT_NW
Move viewport north-west.
Definition: action.h:93
@ ACTION_KEYBINDINGS
Display keybindings list.
Definition: action.h:259
@ ACTION_SHIFT_E
Move viewport east.
Definition: action.h:83
@ ACTION_TOGGLE_MAP_MEMORY
Toggle memorized tiles being shown.
Definition: action.h:75
@ ACTION_SHIFT_S
Move viewport south.
Definition: action.h:87
@ ACTION_SHIFT_SE
Move viewport south-east.
Definition: action.h:85
@ ACTION_LOOK
Toggle look mode.
Definition: action.h:119
@ ACTION_SHIFT_NE
Move viewport north-east.
Definition: action.h:81
@ ACTION_SHIFT_W
Move viewport west.
Definition: action.h:91
@ ACTION_SHIFT_N
Move viewport north.
Definition: action.h:79
bool terrain_requires_animation()
Definition: animation.cpp:1144
bool minimap_requires_animation()
Definition: animation.cpp:1135
void draw_sct()
Definition: animation.cpp:805
void draw_weather(const weather_printable &wPrint)
Definition: animation.cpp:764
void add_draw_callback(shared_ptr_fast< draw_callback_t > cb)
Definition: game.cpp:2994
bool handle_mouseview(input_context &ctxt, std::string &action)
Definition: game.cpp:1994
void set_timeout(int val)
Sets input polling timeout as appropriate for the current interface system.
Definition: input.cpp:1458
std::string get_desc(const std::string &action_descriptor, unsigned int max_limit=0, const input_event_filter &evt_filter=allow_all_keys) const
Get a description text for the key/other input method associated with the given action.
Definition: input.cpp:756
void register_action(const std::string &action_descriptor)
Register an action with this input context.
Definition: input.cpp:676
void set_iso(bool mode=true)
Definition: input.cpp:1429
void reset_timeout()
Definition: input.cpp:1463
std::vector< cSCT > vSCT
Definition: output.h:959
void advanceAllSteps()
Definition: output.cpp:1924
bool has_timeout_elapsed()
input_context get_default_mode_input_context()
Definition: game.cpp:2094
static bool init_weather_anim(const weather_type_id &wtype, weather_printable &wPrint)
static void generate_weather_anim_frame(const weather_type_id &wtype, weather_printable &wPrint)
direction
Definition: line.h:39
scrollingcombattext SCT
Definition: output.cpp:65
Weather drawing tracking.
Definition: weather.h:59
translation to_translation(const std::string &raw)
Shorthands for translation::to_translation.

References _, action, ACTION_CENTER, action_ident(), ACTION_KEYBINDINGS, ACTION_LOOK, ACTION_SHIFT_E, ACTION_SHIFT_N, ACTION_SHIFT_NE, ACTION_SHIFT_NW, ACTION_SHIFT_S, ACTION_SHIFT_SE, ACTION_SHIFT_SW, ACTION_SHIFT_W, ACTION_TOGGLE_MAP_MEMORY, add_draw_callback(), scrollingcombattext::advanceAllSteps(), c_red, critter_at(), draw_sct(), draw_weather(), generate_weather_anim_frame(), get_default_mode_input_context(), input_context::get_desc(), get_levz(), get_weather, handle_mouseview(), user_turn::has_timeout_elapsed(), init_weather_anim(), invalidate_main_ui_adaptor(), m, minimap_requires_animation(), Character::posz(), QUIT_WATCH, ui_manager::redraw_invalidated(), input_context::register_action(), input_context::reset_timeout(), SCT, Character::sees(), input_context::set_iso(), input_context::set_timeout(), terrain_requires_animation(), to_translation(), u, map::update_visibility_cache(), uquit, utf8_width(), and scrollingcombattext::vSCT.

Referenced by handle_action().

◆ get_seed()

unsigned int game::get_seed ( ) const

Definition at line 1775 of file game.cpp.

1776{
1777 return seed;
1778}

References seed.

◆ get_user_action_counter()

int game::get_user_action_counter ( ) const

Definition at line 7066 of file game.cpp.

7067{
7068 return user_action_counter;
7069}

References user_action_counter.

◆ get_veh_dir_indicator_location()

cata::optional< tripoint > game::get_veh_dir_indicator_location ( bool  next) const

Returns the location where the indicator should go relative to the reality bubble, or nothing to indicate no indicator should be drawn.

Based on the vehicle the player is driving, if any.

Parameters
nextIf true, bases it on the vehicle the vehicle will turn to next turn, instead of the one it is currently facing.

Definition at line 3249 of file game.cpp.

3250{
3251 if( !get_option<bool>( "VEHICLE_DIR_INDICATOR" ) ) {
3252 return cata::nullopt;
3253 }
3254 const optional_vpart_position vp = m.veh_at( u.pos() );
3255 if( !vp ) {
3256 return cata::nullopt;
3257 }
3258 vehicle *const veh = &vp->vehicle();
3259 rl_vec2d face = next ? veh->dir_vec() : veh->face_vec();
3260 float r = 10.0;
3261 return tripoint( static_cast<int>( r * face.x ), static_cast<int>( r * face.y ), u.pos().z );
3262}
rl_vec2d dir_vec() const

References vehicle::dir_vec(), vehicle::face_vec(), m, cata::nullopt, Character::pos(), u, map::veh_at(), rl_vec2d::x, rl_vec2d::y, and tripoint::z.

Referenced by draw_veh_dir_indicator().

◆ get_world_base_save_path()

std::string game::get_world_base_save_path ( ) const

Base path for saving world data.

This yields a path to a folder.

Definition at line 11966 of file game.cpp.

11967{
11968 if( world_generator->active_world == nullptr ) {
11969 return PATH_INFO::savedir();
11970 }
11971 return world_generator->active_world->folder_path();
11972}
std::string savedir()
Definition: path_info.cpp:254

References PATH_INFO::savedir(), and world_generator.

Referenced by get_player_base_save_path(), load(), load_master(), move_save_to_graveyard(), save(), save_artifacts(), save_factions_missions_npcs(), and setup().

◆ get_zoom()

int game::get_zoom ( ) const

Definition at line 7052 of file game.cpp.

7053{
7054#if defined(TILES)
7055 return tileset_zoom;
7056#else
7057 return DEFAULT_TILESET_ZOOM;
7058#endif
7059}

References DEFAULT_TILESET_ZOOM, and tileset_zoom.

Referenced by look_around().

◆ grabbed_furn_move()

bool game::grabbed_furn_move ( const tripoint dp)
private
Strength determines ability to drag furniture

Definition at line 9473 of file game.cpp.

9474{
9475 // Furniture: pull, push, or standing still and nudging object around.
9476 // Can push furniture out of reach.
9477 tripoint fpos = u.pos() + u.grab_point;
9478 // supposed position of grabbed furniture
9479 if( !m.has_furn( fpos ) ) {
9480 // Where did it go? We're grabbing thin air so reset.
9481 add_msg( m_info, _( "No furniture at grabbed point." ) );
9482 u.grab( OBJECT_NONE );
9483 return false;
9484 }
9485
9486 const bool pushing_furniture = dp == u.grab_point;
9487 const bool pulling_furniture = dp == -u.grab_point;
9488 const bool shifting_furniture = !pushing_furniture && !pulling_furniture;
9489
9490 tripoint fdest = fpos + dp; // intended destination of furniture.
9491 // Check floor: floorless tiles don't need to be flat and have no traps
9492 const bool has_floor = m.has_floor( fdest );
9493 // Unfortunately, game::is_empty fails for tiles we're standing on,
9494 // which will forbid pulling, so:
9495 const bool canmove = (
9496 m.passable( fdest ) &&
9497 critter_at<npc>( fdest ) == nullptr &&
9498 critter_at<monster>( fdest ) == nullptr &&
9499 ( !pulling_furniture || is_empty( u.pos() + dp ) ) &&
9500 ( !has_floor || m.has_flag( "FLAT", fdest ) ) &&
9501 !m.has_furn( fdest ) &&
9502 !m.veh_at( fdest ) &&
9503 ( !has_floor || m.tr_at( fdest ).is_null() )
9504 );
9505
9506 const furn_t furntype = m.furn( fpos ).obj();
9507 const int src_items = m.i_at( fpos ).size();
9508 const int dst_items = m.i_at( fdest ).size();
9509
9510 const bool only_liquid_items = std::all_of( m.i_at( fdest ).begin(), m.i_at( fdest ).end(),
9511 [&]( item & liquid_item ) {
9512 return liquid_item.made_of( LIQUID );
9513 } );
9514
9515 const bool dst_item_ok = !m.has_flag( "NOITEM", fdest ) &&
9516 !m.has_flag( "SWIMMABLE", fdest ) &&
9517 !m.has_flag( "DESTROY_ITEM", fdest );
9518
9519 const bool src_item_ok = m.furn( fpos ).obj().has_flag( "CONTAINER" ) ||
9520 m.furn( fpos ).obj().has_flag( "FIRE_CONTAINER" ) ||
9521 m.furn( fpos ).obj().has_flag( "SEALED" );
9522
9523 const int fire_intensity = m.get_field_intensity( fpos, fd_fire );
9524 time_duration fire_age = m.get_field_age( fpos, fd_fire );
9525
9526 int str_req = furntype.move_str_req;
9527 // Factor in weight of items contained in the furniture.
9528 units::mass furniture_contents_weight = 0_gram;
9529 for( auto &contained_item : m.i_at( fpos ) ) {
9530 furniture_contents_weight += contained_item.weight();
9531 }
9532 str_req += furniture_contents_weight / 4_kilogram;
9533 if( !canmove ) {
9534 // TODO: What is something?
9535 add_msg( _( "The %s collides with something." ), furntype.name() );
9536 u.moves -= 50;
9537 return true;
9538 ///\EFFECT_STR determines ability to drag furniture
9539 } else if( str_req > u.get_str() &&
9540 one_in( std::max( 20 - str_req - u.get_str(), 2 ) ) ) {
9541 add_msg( m_bad, _( "You strain yourself trying to move the heavy %s!" ),
9542 furntype.name() );
9543 u.moves -= 100;
9544 u.mod_pain( 1 ); // Hurt ourselves.
9545 return true; // furniture and or obstacle wins.
9546 } else if( !src_item_ok && !only_liquid_items && dst_items > 0 ) {
9547 add_msg( _( "There's stuff in the way." ) );
9548 u.moves -= 50;
9549 return true;
9550 }
9551
9552 u.moves -= str_req * 10;
9553 // Additional penalty if we can't comfortably move it.
9554 if( str_req > u.get_str() ) {
9555 int move_penalty = std::pow( str_req, 2.0 ) + 100.0;
9556 if( move_penalty <= 1000 ) {
9557 if( u.get_str() >= str_req - 3 ) {
9558 u.moves -= std::max( 3000, move_penalty * 10 );
9559 add_msg( m_bad, _( "The %s is really heavy!" ), furntype.name() );
9560 if( one_in( 3 ) ) {
9561 add_msg( m_bad, _( "You fail to move the %s." ), furntype.name() );
9562 return true;
9563 }
9564 } else {
9565 u.moves -= 100;
9566 add_msg( m_bad, _( "The %s is too heavy for you to budge." ), furntype.name() );
9567 return true;
9568 }
9569 }
9570 u.moves -= move_penalty;
9571 if( move_penalty > 500 ) {
9572 add_msg( _( "Moving the heavy %s is taking a lot of time!" ),
9573 furntype.name() );
9574 } else if( move_penalty > 200 ) {
9575 if( one_in( 3 ) ) { // Nag only occasionally.
9576 add_msg( _( "It takes some time to move the heavy %s." ),
9577 furntype.name() );
9578 }
9579 }
9580 }
9582 _( "a scraping noise." ), true, "misc", "scraping" );
9583
9585 ( tripoint_abs_ms( m.getabs( fpos ) ) );
9586
9587 // Actually move the furniture.
9588 m.furn_set( fdest, m.furn( fpos ), atd ? atd->clone() : nullptr );
9589 m.furn_set( fpos, f_null );
9590
9591 if( fire_intensity == 1 && !pulling_furniture ) {
9592 m.remove_field( fpos, fd_fire );
9593 m.set_field_intensity( fdest, fd_fire, fire_intensity );
9594 m.set_field_age( fdest, fd_fire, fire_age );
9595 }
9596
9597 // Is there is only liquids on the ground, remove them after moving furniture.
9598 if( dst_items > 0 && only_liquid_items ) {
9599 m.i_clear( fdest );
9600 }
9601
9602 if( src_items > 0 ) { // Move the stuff inside.
9603 if( dst_item_ok && src_item_ok ) {
9604 // Assume contents of both cells are legal, so we can just swap contents.
9605 std::list<item> temp;
9606 std::move( m.i_at( fpos ).begin(), m.i_at( fpos ).end(),
9607 std::back_inserter( temp ) );
9608 m.i_clear( fpos );
9609 for( auto item_iter = m.i_at( fdest ).begin();
9610 item_iter != m.i_at( fdest ).end(); ++item_iter ) {
9611 m.i_at( fpos ).insert( *item_iter );
9612 }
9613 m.i_clear( fdest );
9614 for( auto &cur_item : temp ) {
9615 m.i_at( fdest ).insert( cur_item );
9616 }
9617 } else {
9618 add_msg( _( "Stuff spills from the %s!" ), furntype.name() );
9619 }
9620 }
9621
9622 if( shifting_furniture ) {
9623 // We didn't move
9624 tripoint d_sum = u.grab_point + dp;
9625 if( std::abs( d_sum.x ) < 2 && std::abs( d_sum.y ) < 2 ) {
9626 u.grab_point = d_sum; // furniture moved relative to us
9627 } else { // we pushed furniture out of reach
9628 add_msg( _( "You let go of the %s." ), furntype.name() );
9629 u.grab( OBJECT_NONE );
9630 }
9631 return true; // We moved furniture but stayed still.
9632 }
9633
9634 if( pushing_furniture && m.impassable( fpos ) ) {
9635 // Not sure how that chair got into a wall, but don't let player follow.
9636 add_msg( _( "You let go of the %1$s as it slides past %2$s." ),
9637 furntype.name(), m.tername( fdest ) );
9638 u.grab( OBJECT_NONE );
9639 return true;
9640 }
9641
9642 return false;
9643}
virtual int get_str() const
Getters for stats exclusive to characters.
Definition: character.cpp:4076
virtual active_tile_data * clone() const =0
void grab(object_type grab_type, const tripoint &grab_point=tripoint_zero)
Definition: avatar.cpp:664
bool is_empty(const tripoint &p)
Returns true if there is no player, NPC, or monster on the tile and move_cost > 0.
Definition: game.cpp:4799
void insert(const item &newitem) override
Definition: map.cpp:157
void remove_field(const tripoint &p, const field_type_id &field_to_remove)
Remove field entry at xy, ignored if the field entry is not present.
Definition: map.cpp:5467
time_duration set_field_age(const tripoint &p, const field_type_id &type, const time_duration &age, bool isoffset=false)
Set age of field entry at point.
Definition: map.cpp:5341
time_duration get_field_age(const tripoint &p, const field_type_id &type) const
Get the age of a field entry (field_entry::age), if there is no field of that type,...
Definition: map.cpp:5375
int get_field_intensity(const tripoint &p, const field_type_id &type) const
Get the intensity of a field entry (field_entry::intensity), if there is no field of that type,...
Definition: map.cpp:5381
int set_field_intensity(const tripoint &p, const field_type_id &type, int new_intensity, bool isoffset=false)
Set intensity of field entry at point, creating if not present, removing if intensity becomes 0.
Definition: map.cpp:5354
std::string tername(const tripoint &p) const
Definition: map.cpp:1709
void i_clear(const tripoint &p)
Definition: map.cpp:4128
void furn_set(const tripoint &p, const furn_id &new_furniture, cata::poly_serialized< active_tile_data > new_active=nullptr)
Sets the furniture at given position.
Definition: map.cpp:1360
bool has_floor(const tripoint &p) const
Definition: map.cpp:2007
tripoint grab_point
Definition: player.h:465
coords::coord_point< tripoint, coords::origin::abs, coords::ms > tripoint_abs_ms
Definition: coordinates.h:486
@ OBJECT_NONE
Definition: enums.h:187
field_type_id fd_fire
Definition: field_type.cpp:345
furn_id f_null
Definition: mapdata.cpp:1097
template active_tile_data * furn_at< active_tile_data >(const tripoint_abs_ms &)
bool move(avatar &you, map &m, const tripoint &d)
void sound(const tripoint &p, int vol, sound_t category, const std::string &description, bool ambient=false, const std::string &id="", const std::string &variant="default")
Sound at (p) of intensity (vol)
Definition: sounds.cpp:177
int move_str_req
Definition: mapdata.h:515
bool has_flag(const std::string &flag) const
Definition: mapdata.h:419

References _, add_msg(), item_stack::begin(), active_tile_data::clone(), item_stack::end(), f_null, fd_fire, map::furn(), active_tiles::furn_at< active_tile_data >(), map::furn_set(), map::get_field_age(), map::get_field_intensity(), Character::get_str(), map::getabs(), avatar::grab(), player::grab_point, map_data_common_t::has_flag(), map::has_flag(), map::has_floor(), map::has_furn(), map::i_at(), map::i_clear(), map::impassable(), map_stack::insert(), is_empty(), trap::is_null(), m, m_bad, m_info, Character::mod_pain(), avatar_action::move(), furn_t::move_str_req, sounds::movement, Creature::moves, map_data_common_t::name(), int_id< T >::obj(), OBJECT_NONE, one_in(), map::passable(), Character::pos(), map::remove_field(), map::set_field_age(), map::set_field_intensity(), item_stack::size(), sounds::sound(), map::tername(), map::tr_at(), u, map::veh_at(), tripoint::x, and tripoint::y.

Referenced by grabbed_move().

◆ grabbed_move()

bool game::grabbed_move ( const tripoint dp)
private

Check for dangerous stuff at dest_loc, return false if the player decides not to step there.

Definition at line 9645 of file game.cpp.

9646{
9647 if( u.get_grab_type() == OBJECT_NONE ) {
9648 return false;
9649 }
9650
9651 if( dp.z != 0 ) {
9652 // No dragging stuff up/down stairs yet!
9653 return false;
9654 }
9655
9656 // vehicle: pulling, pushing, or moving around the grabbed object.
9657 if( u.get_grab_type() == OBJECT_VEHICLE ) {
9658 return grabbed_veh_move( dp );
9659 }
9660
9661 if( u.get_grab_type() == OBJECT_FURNITURE ) {
9662 return grabbed_furn_move( dp );
9663 }
9664
9665 add_msg( m_info, _( "Nothing at grabbed point %d,%d,%d or bad grabbed object type." ),
9667 u.grab( OBJECT_NONE );
9668 return false;
9669}
object_type get_grab_type() const
Definition: avatar.cpp:672
bool grabbed_furn_move(const tripoint &dp)
Definition: game.cpp:9473
bool grabbed_veh_move(const tripoint &dp)
Definition: grab.cpp:21
@ OBJECT_FURNITURE
Definition: enums.h:197
@ OBJECT_VEHICLE
Definition: enums.h:193

References _, add_msg(), avatar::get_grab_type(), avatar::grab(), player::grab_point, grabbed_furn_move(), grabbed_veh_move(), m_info, OBJECT_FURNITURE, OBJECT_NONE, OBJECT_VEHICLE, u, tripoint::x, tripoint::y, and tripoint::z.

Referenced by walk_move().

◆ grabbed_veh_move()

bool game::grabbed_veh_move ( const tripoint dp)
private
Strength determines ability to drag vehicles Strength increases speed of dragging vehicles

Definition at line 21 of file grab.cpp.

22{
23 const optional_vpart_position grabbed_vehicle_vp = m.veh_at( u.pos() + u.grab_point );
24 if( !grabbed_vehicle_vp ) {
25 add_msg( m_info, _( "No vehicle at grabbed point." ) );
27 return false;
28 }
29 vehicle *grabbed_vehicle = &grabbed_vehicle_vp->vehicle();
30 if( !grabbed_vehicle ||
31 !grabbed_vehicle->handle_potential_theft( dynamic_cast<player &>( g->u ) ) ) {
32 return false;
33 }
34 const int grabbed_part = grabbed_vehicle_vp->part_index();
35 for( int part_index = 0; part_index < grabbed_vehicle->part_count(); ++part_index ) {
36 monster *mon = grabbed_vehicle->get_pet( part_index );
37 if( mon != nullptr && mon->has_effect( effect_harnessed ) ) {
38 add_msg( m_info, _( "You cannot move this vehicle whilst your %s is harnessed!" ),
39 mon->get_name() );
41 return false;
42 }
43 }
44 const vehicle *veh_under_player = veh_pointer_or_null( m.veh_at( u.pos() ) );
45 if( grabbed_vehicle == veh_under_player ) {
46 u.grab_point = -dp;
47 return false;
48 }
49
50 tripoint dp_veh = -u.grab_point;
51 const tripoint prev_grab = u.grab_point;
52 tripoint next_grab = u.grab_point;
53
54 bool zigzag = false;
55
56 if( dp == prev_grab ) {
57 // We are pushing in the direction of vehicle
58 dp_veh = dp;
59 } else if( std::abs( dp.x + dp_veh.x ) != 2 && std::abs( dp.y + dp_veh.y ) != 2 ) {
60 // Not actually moving the vehicle, don't do the checks
61 u.grab_point = -( dp + dp_veh );
62 return false;
63 } else if( ( dp.x == prev_grab.x || dp.y == prev_grab.y ) &&
64 next_grab.x != 0 && next_grab.y != 0 ) {
65 // Zig-zag (or semi-zig-zag) pull: player is diagonal to vehicle
66 // and moves away from it, but not directly away
67 dp_veh.x = dp.x == -dp_veh.x ? 0 : dp_veh.x;
68 dp_veh.y = dp.y == -dp_veh.y ? 0 : dp_veh.y;
69
70 next_grab = -dp_veh;
71 zigzag = true;
72 } else {
73 // We are pulling the vehicle
74 next_grab = -dp;
75 }
76
77 // Make sure the mass and pivot point are correct
78 grabbed_vehicle->invalidate_mass();
79
80 //vehicle movement: strength check
81 int mc = 0;
82 int str_req = grabbed_vehicle->total_mass() / 25_kilogram; //strength required to move vehicle.
83
84 //if vehicle is rollable we modify str_req based on a function of movecost per wheel.
85
86 // Vehicle just too big to grab & move; 41-45 lets folks have a bit of a window
87 // (Roughly 1.1K kg = danger zone; cube vans are about the max)
88 if( str_req > 45 ) {
89 add_msg( m_info, _( "The %s is too bulky for you to move by hand." ),
90 grabbed_vehicle->name );
91 return true; // No shoving around an RV.
92 }
93
94 const auto &wheel_indices = grabbed_vehicle->wheelcache;
95 if( grabbed_vehicle->valid_wheel_config() ) {
96 //determine movecost for terrain touching wheels
97 const tripoint vehpos = grabbed_vehicle->global_pos3();
98 for( int p : wheel_indices ) {
99 const tripoint wheel_pos = vehpos + grabbed_vehicle->part( p ).precalc[0];
100 const int mapcost = m.move_cost( wheel_pos, grabbed_vehicle );
101 mc += str_req / wheel_indices.size() * mapcost;
102 }
103 //set strength check threshold
104 //if vehicle has many or only one wheel (shopping cart), it is as if it had four.
105 if( wheel_indices.size() > 4 || wheel_indices.size() == 1 ) {
106 str_req = mc / 4 + 1;
107 } else {
108 str_req = mc / wheel_indices.size() + 1;
109 }
110 } else {
111 str_req++;
112 //if vehicle has no wheels str_req make a noise.
113 if( str_req <= u.get_str() ) {
114 sounds::sound( grabbed_vehicle->global_pos3(), str_req * 2, sounds::sound_t::movement,
115 _( "a scraping noise." ), true, "misc", "scraping" );
116 }
117 }
118
119 //final strength check and outcomes
120 ///\EFFECT_STR determines ability to drag vehicles
121 if( str_req <= u.get_str() ) {
122 //calculate exertion factor and movement penalty
123 ///\EFFECT_STR increases speed of dragging vehicles
124 u.moves -= 100 * str_req / std::max( 1, u.get_str() );
125 const int ex = dice( 1, 3 ) - 1 + str_req;
126 if( ex > u.get_str() + 1 ) {
127 // Pain and movement penalty if exertion exceeds character strength
128 add_msg( m_bad, _( "You strain yourself to move the %s!" ), grabbed_vehicle->name );
129 u.moves -= 200;
130 u.mod_pain( 1 );
131 } else if( ex >= u.get_str() ) {
132 // Movement is slow if exertion nearly equals character strength
133 add_msg( _( "It takes some time to move the %s." ), grabbed_vehicle->name );
134 u.moves -= 200;
135 }
136 } else {
137 u.moves -= 100;
138 add_msg( m_bad, _( "You lack the strength to move the %s" ), grabbed_vehicle->name );
139 return true;
140 }
141
142 std::string blocker_name = _( "errors in movement code" );
143 const auto get_move_dir = [&]( const tripoint & dir, const tripoint & from ) {
144 tileray mdir;
145
146 mdir.init( dir.xy() );
147 grabbed_vehicle->turn( mdir.dir() - grabbed_vehicle->face.dir() );
148 grabbed_vehicle->face = grabbed_vehicle->turn_dir;
149 grabbed_vehicle->precalc_mounts( 1, mdir.dir(), grabbed_vehicle->pivot_point() );
150
151 // Grabbed part has to stay at distance 1 to the player
152 // and in roughly the same direction.
153 const tripoint new_part_pos = grabbed_vehicle->global_pos3() +
154 grabbed_vehicle->part( grabbed_part ).precalc[ 1 ];
155 const tripoint expected_pos = u.pos() + dp + from;
156 const tripoint actual_dir = expected_pos - new_part_pos;
157
158 grabbed_vehicle->adjust_zlevel( 1, dp );
159
160 // Set player location to illegal value so it can't collide with vehicle.
161 const tripoint player_prev = u.pos();
163 std::vector<veh_collision> colls;
164 const bool failed = grabbed_vehicle->collision( colls, actual_dir, true );
165 u.setpos( player_prev );
166 if( !colls.empty() ) {
167 blocker_name = colls.front().target_name;
168 }
169 return failed ? tripoint_zero : actual_dir;
170 };
171
172 // First try the move as intended
173 // But if that fails and the move is a zig-zag, try to recover:
174 // Try to place the vehicle in the position player just left rather than "flattening" the zig-zag
175 tripoint final_dp_veh = get_move_dir( dp_veh, next_grab );
176 if( final_dp_veh == tripoint_zero && zigzag ) {
177 final_dp_veh = get_move_dir( -prev_grab, -dp );
178 next_grab = -dp;
179 }
180
181 if( final_dp_veh == tripoint_zero ) {
182 add_msg( _( "The %s collides with %s." ), grabbed_vehicle->name, blocker_name );
183 u.grab_point = prev_grab;
184 return true;
185 }
186
187 u.grab_point = next_grab;
188
189 m.displace_vehicle( *grabbed_vehicle, final_dp_veh );
190
191 if( grabbed_vehicle ) {
192 grabbed_vehicle->shift_zlevel();
193 grabbed_vehicle->check_falling_or_floating();
194 } else {
195 debugmsg( "Grabbed vehicle disappeared" );
196 return false;
197 }
198
199 for( int p : wheel_indices ) {
200 if( one_in( 2 ) ) {
201 tripoint wheel_p = grabbed_vehicle->global_part_pos3( grabbed_part );
202 grabbed_vehicle->handle_trap( wheel_p, p );
203 }
204 }
205
206 return false;
207
208}
bool displace_vehicle(vehicle &veh, const tripoint &dp)
Definition: map.cpp:1119
int move_cost(const tripoint &p, const vehicle *ignored_vehicle=nullptr) const
Calculate the cost to move past the tile at p.
Definition: map.cpp:1780
units::angle dir() const
Definition: tileray.cpp:74
void init(const point &ad)
Definition: tileray.cpp:27
void turn(units::angle deg)
const point & pivot_point() const
Definition: vehicle.cpp:5826
void adjust_zlevel(int idir=0, const tripoint &offset=tripoint_zero)
tripoint global_pos3() const
Definition: vehicle.cpp:3281
void precalc_mounts(int idir, units::angle dir, const point &pivot)
Definition: vehicle.cpp:3150
bool valid_wheel_config() const
Definition: vehicle.cpp:4459
units::mass total_mass() const
Definition: vehicle.cpp:3306
std::vector< int > wheelcache
Definition: vehicle.h:1818
void check_falling_or_floating()
tileray face
Definition: vehicle.h:1948
void invalidate_mass()
Mark mass caches and pivot cache as dirty.
Definition: vehicle.cpp:6970
int part_count() const
Definition: vehicle.cpp:7077
bool collision(std::vector< veh_collision > &colls, const tripoint &dp, bool just_detect, bool bash_floor=false)
monster * get_pet(int p) const
Definition: vehicle.cpp:3262
vehicle_part & part(int part_num)
Definition: vehicle.cpp:7082
void handle_trap(const tripoint &p, int part)
tripoint global_part_pos3(const int &index) const
Get the coordinates of the studied part of the vehicle.
Definition: vehicle.cpp:3286
void shift_zlevel()
units::angle turn_dir
Definition: vehicle.h:1927
static const efftype_id effect_harnessed("harnessed")
static constexpr tripoint tripoint_zero
Definition: point.h:273
int dice(int number, int sides)
Definition: rng.cpp:85
std::array< tripoint, 2 > precalc
mount translated to face.dir [0] and turn_dir [1]
Definition: vehicle.h:371

References _, add_msg(), vehicle::adjust_zlevel(), vehicle::check_falling_or_floating(), vehicle::collision(), debugmsg, dice(), tileray::dir(), map::displace_vehicle(), effect_harnessed, vehicle::face, failed, g, monster::get_name(), vehicle::get_pet(), Character::get_str(), vehicle::global_part_pos3(), vehicle::global_pos3(), avatar::grab(), player::grab_point, vehicle::handle_potential_theft(), vehicle::handle_trap(), Creature::has_effect(), tileray::init(), vehicle::invalidate_mass(), m, m_bad, m_info, Character::mod_pain(), map::move_cost(), sounds::movement, Creature::moves, vehicle::name, OBJECT_NONE, one_in(), vehicle::part(), vehicle::part_count(), vehicle::pivot_point(), Character::pos(), vehicle_part::precalc, vehicle::precalc_mounts(), Character::setpos(), vehicle::shift_zlevel(), sounds::sound(), vehicle::total_mass(), tripoint_zero, vehicle::turn(), vehicle::turn_dir, u, vehicle::valid_wheel_config(), map::veh_at(), veh_pointer_or_null(), vehicle::wheelcache, tripoint::x, tripoint::xy(), and tripoint::y.

Referenced by grabbed_move().

◆ handle_action()

bool game::handle_action ( )
private

Definition at line 1519 of file handle_action.cpp.

1520{
1521 std::string action;
1522 input_context ctxt;
1524 user_turn current_turn;
1525 // Check if we have an auto-move destination
1526 if( u.has_destination() ) {
1528 if( act == ACTION_NULL ) {
1529 add_msg( m_info, _( "Auto-move canceled" ) );
1531 return false;
1532 }
1533 } else if( u.has_destination_activity() ) {
1534 // starts destination activity after the player successfully reached his destination
1536 return false;
1537 } else {
1538 // No auto-move, ask player for input
1539 ctxt = get_player_input( action );
1540 }
1541
1542 const optional_vpart_position vp = m.veh_at( u.pos() );
1543 bool veh_ctrl = !u.is_dead_state() &&
1544 ( ( vp && vp->vehicle().player_in_control( u ) ) || remoteveh() != nullptr );
1545
1546 // If performing an action with right mouse button, co-ordinates
1547 // of location clicked.
1548 cata::optional<tripoint> mouse_target;
1549
1550 if( uquit == QUIT_WATCH && action == "QUIT" ) {
1551 uquit = QUIT_DIED;
1552 return false;
1553 }
1554
1555 if( act == ACTION_NULL ) {
1557
1558 if( act == ACTION_KEYBINDINGS ) {
1559 // already handled by input context
1560 return false;
1561 }
1562
1563 if( act == ACTION_MAIN_MENU ) {
1564 if( uquit == QUIT_WATCH ) {
1565 return false;
1566 }
1567 // No auto-move actions have or can be set at this point.
1569 destination_preview.clear();
1571 if( act == ACTION_NULL ) {
1572 return false;
1573 }
1574 }
1575
1576 if( act == ACTION_ACTIONMENU ) {
1577 if( uquit == QUIT_WATCH ) {
1578 return false;
1579 }
1580 // No auto-move actions have or can be set at this point.
1582 destination_preview.clear();
1584 if( act == ACTION_NULL ) {
1585 return false;
1586 }
1587#if defined(__ANDROID__)
1588 if( get_option<bool>( "ANDROID_ACTIONMENU_AUTOADD" ) && ctxt.get_category() == "DEFAULTMODE" ) {
1589 add_best_key_for_action_to_quick_shortcuts( act, ctxt.get_category(), false );
1590 }
1591#endif
1592 }
1593
1594 if( act == ACTION_KEYBINDINGS ) {
1596 destination_preview.clear();
1597 act = ctxt.display_menu( true );
1598 if( act == ACTION_NULL ) {
1599 return false;
1600 }
1601 }
1602
1605 }
1606
1607 if( act == ACTION_SELECT || act == ACTION_SEC_SELECT ) {
1608 // Mouse button click
1609 if( veh_ctrl ) {
1610 // No mouse use in vehicle
1611 return false;
1612 }
1613
1614 if( u.is_dead_state() ) {
1615 // do not allow mouse actions while dead
1616 return false;
1617 }
1618
1619 const cata::optional<tripoint> mouse_pos = ctxt.get_coordinates( w_terrain );
1620 if( !mouse_pos ) {
1621 return false;
1622 } else if( !u.sees( *mouse_pos ) ) {
1623 // Not clicked in visible terrain
1624 return false;
1625 }
1626 mouse_target = mouse_pos;
1627
1628 if( act == ACTION_SELECT ) {
1629 // Note: The following has the potential side effect of
1630 // setting auto-move destination state in addition to setting
1631 // act.
1632 if( !try_get_left_click_action( act, *mouse_target ) ) {
1633 return false;
1634 }
1635 } else if( act == ACTION_SEC_SELECT ) {
1636 if( !try_get_right_click_action( act, *mouse_target ) ) {
1637 return false;
1638 }
1639 }
1640 } else if( act != ACTION_TIMEOUT ) {
1641 // act has not been set for an auto-move, so clearing possible
1642 // auto-move destinations. Since initializing an auto-move with
1643 // the mouse may span across multiple actions, we do not clear the
1644 // auto-move destination if the action is only a timeout, as this
1645 // would require the user to double click quicker than the
1646 // timeout delay.
1648 destination_preview.clear();
1649 }
1650 }
1651
1652 if( act == ACTION_NULL ) {
1653 const input_event &&evt = ctxt.get_raw_input();
1654 if( !evt.sequence.empty() ) {
1655 const int ch = evt.get_first_input();
1656 const std::string &&name = inp_mngr.get_keyname( ch, evt.type, true );
1657 if( !get_option<bool>( "NO_UNKNOWN_COMMAND_MSG" ) ) {
1658 add_msg( m_info, _( "Unknown command: \"%s\" (%ld)" ), name, ch );
1659 if( const cata::optional<std::string> hint =
1661 add_msg( m_info, _( "%s at any time to see and edit keybindings relevant to "
1662 "the current context." ),
1663 *hint );
1664 }
1665 }
1666 }
1667 return false;
1668 }
1669
1670 // This has no action unless we're in a special game mode.
1671 gamemode->pre_action( act );
1672
1673 int soffset = get_option<int>( "MOVE_VIEW_OFFSET" );
1674
1675 int before_action_moves = u.moves;
1676
1677 // These actions are allowed while deathcam is active. Registered in game::get_player_input
1678 if( uquit == QUIT_WATCH || !u.is_dead_state() ) {
1679 switch( act ) {
1682 break;
1683
1684 case ACTION_CENTER:
1687 break;
1688
1689 case ACTION_SHIFT_N:
1690 case ACTION_SHIFT_NE:
1691 case ACTION_SHIFT_E:
1692 case ACTION_SHIFT_SE:
1693 case ACTION_SHIFT_S:
1694 case ACTION_SHIFT_SW:
1695 case ACTION_SHIFT_W:
1696 case ACTION_SHIFT_NW: {
1697 static const std::map<action_id, std::pair<point, point>> shift_delta = {
1706 };
1708 shift_delta.at( act ).second * soffset : shift_delta.at( act ).first * soffset;
1709 }
1710 break;
1711
1712 case ACTION_LOOK:
1713 look_around();
1714 break;
1715
1716 case ACTION_KEYBINDINGS:
1717 // already handled by input context
1718 break;
1719
1720 default:
1721 break;
1722 }
1723 }
1724
1725 // actions allowed only while alive
1726 if( !u.is_dead_state() ) {
1727 switch( act ) {
1728 case ACTION_NULL:
1729 case NUM_ACTIONS:
1730 break; // dummy entries
1731 case ACTION_ACTIONMENU:
1732 case ACTION_MAIN_MENU:
1733 case ACTION_KEYBINDINGS:
1734 break; // handled above
1735
1736 case ACTION_TIMEOUT:
1737 if( check_safe_mode_allowed( false ) ) {
1739 }
1740 break;
1741
1742 case ACTION_PAUSE:
1743 if( check_safe_mode_allowed() ) {
1745 }
1746 break;
1747
1748 case ACTION_CYCLE_MOVE:
1750 break;
1751
1752 case ACTION_RESET_MOVE:
1754 break;
1755
1756 case ACTION_TOGGLE_RUN:
1758 break;
1759
1762 break;
1763
1766 break;
1767
1768 case ACTION_MOVE_FORTH:
1770 case ACTION_MOVE_RIGHT:
1772 case ACTION_MOVE_BACK:
1774 case ACTION_MOVE_LEFT:
1776 if( !u.get_value( "remote_controlling" ).empty() &&
1780 } else if( veh_ctrl ) {
1781 // vehicle control uses x for steering and y for ac/deceleration,
1782 // so no rotation needed
1784 } else {
1786 if( auto_travel_mode && !u.is_auto_moving() ) {
1787 for( int i = 0; i < SEEX; i++ ) {
1788 tripoint auto_travel_destination( u.posx() + dest_delta.x * ( SEEX - i ),
1789 u.posy() + dest_delta.y * ( SEEX - i ),
1790 u.posz() );
1792 auto_travel_destination,
1794 u.get_path_avoid() );
1795 if( !destination_preview.empty() ) {
1798 break;
1799 }
1800 }
1803 if( dest_next == point_zero ) {
1805 }
1806 dest_delta = dest_next;
1807 }
1808 if( !avatar_action::move( u, m, dest_delta ) ) {
1809 // auto-move should be canceled due to a failed move or obstacle
1811 }
1812 }
1813 break;
1814 case ACTION_MOVE_DOWN:
1815 if( u.is_mounted() ) {
1816 auto mon = u.mounted_creature.get();
1817 if( !mon->has_flag( MF_RIDEABLE_MECH ) ) {
1818 add_msg( m_info, _( "You can't go down stairs while you're riding." ) );
1819 break;
1820 }
1821 }
1822 if( !u.in_vehicle ) {
1823 vertical_move( -1, false );
1824 } else if( veh_ctrl && vp->vehicle().is_rotorcraft() ) {
1826 }
1827 break;
1828
1829 case ACTION_MOVE_UP:
1830 if( u.is_mounted() ) {
1831 auto mon = u.mounted_creature.get();
1832 if( !mon->has_flag( MF_RIDEABLE_MECH ) ) {
1833 add_msg( m_info, _( "You can't go down stairs while you're riding." ) );
1834 break;
1835 }
1836 }
1837 if( !u.in_vehicle ) {
1838 vertical_move( 1, false );
1839 } else if( veh_ctrl && vp->vehicle().is_rotorcraft() ) {
1841 } else if( veh_ctrl && vp->vehicle().has_part( "ROTOR" ) &&
1842 !vp->vehicle().has_sufficient_rotorlift() ) {
1843 add_msg( m_bad, _( "The rotors struggle to generate enough lift!" ) );
1844 }
1845 break;
1846
1847 case ACTION_OPEN:
1849 add_msg( m_info, _( "You can't open things while you're in your shell." ) );
1850 } else if( u.is_mounted() ) {
1851 add_msg( m_info, _( "You can't open things while you're riding." ) );
1852 } else {
1853 open();
1854 }
1855 break;
1856
1857 case ACTION_CLOSE:
1859 add_msg( m_info, _( "You can't close things while you're in your shell." ) );
1860 } else if( u.is_mounted() ) {
1861 auto mon = u.mounted_creature.get();
1862 if( !mon->has_flag( MF_RIDEABLE_MECH ) ) {
1863 add_msg( m_info, _( "You can't close things while you're riding." ) );
1864 }
1865 } else if( mouse_target ) {
1866 doors::close_door( m, u, *mouse_target );
1867 } else {
1868 close();
1869 }
1870 break;
1871
1872 case ACTION_SMASH:
1873 if( veh_ctrl ) {
1874 handbrake();
1875 } else if( u.has_active_mutation( trait_SHELL2 ) ) {
1876 add_msg( m_info, _( "You can't smash things while you're in your shell." ) );
1877 } else {
1878 smash();
1879 }
1880 break;
1881
1882 case ACTION_EXAMINE:
1884 add_msg( m_info, _( "You can't examine your surroundings while you're in your shell." ) );
1885 } else if( mouse_target ) {
1886 examine( *mouse_target );
1887 } else {
1888 examine();
1889 }
1890 break;
1891
1892 case ACTION_ADVANCEDINV:
1894 add_msg( m_info, _( "You can't move mass quantities while you're in your shell." ) );
1895 } else if( u.is_mounted() ) {
1896 add_msg( m_info, _( "You can't move mass quantities while you're riding." ) );
1897 } else {
1899 }
1900 break;
1901
1902 case ACTION_PICKUP:
1904 add_msg( m_info, _( "You can't pick anything up while you're in your shell." ) );
1905 } else if( u.is_mounted() ) {
1906 add_msg( m_info, _( "You can't pick anything up while you're riding." ) );
1907 } else if( mouse_target ) {
1908 pickup( *mouse_target );
1909 } else {
1910 pickup();
1911 }
1912 break;
1913
1914 case ACTION_PICKUP_FEET:
1916 add_msg( m_info, _( "You can't pick anything up while you're in your shell." ) );
1917 } else {
1918 pickup_feet();
1919 }
1920 break;
1921
1922 case ACTION_GRAB:
1924 add_msg( m_info, _( "You can't grab things while you're in your shell." ) );
1925 } else if( u.is_mounted() ) {
1926 add_msg( m_info, _( "You can't grab things while you're riding." ) );
1927 } else {
1928 grab();
1929 }
1930 break;
1931
1932 case ACTION_HAUL:
1934 add_msg( m_info, _( "You can't haul things while you're in your shell." ) );
1935 } else if( u.is_mounted() ) {
1936 add_msg( m_info, _( "You can't haul things while you're riding." ) );
1937 } else {
1938 haul();
1939 }
1940 break;
1941
1942 case ACTION_BUTCHER:
1944 add_msg( m_info, _( "You can't butcher while you're in your shell." ) );
1945 } else if( u.is_mounted() ) {
1946 add_msg( m_info, _( "You can't butcher while you're riding." ) );
1947 } else {
1948 butcher();
1949 }
1950 break;
1951
1952 case ACTION_CHAT:
1953 chat();
1954 break;
1955
1956 case ACTION_PEEK:
1958 add_msg( m_info, _( "You can't peek around corners while you're in your shell." ) );
1959 } else if( u.is_mounted() ) {
1960 add_msg( m_info, _( "You can't peek around corners while you're riding." ) );
1961 } else {
1962 peek();
1963 }
1964 break;
1965
1966 case ACTION_LIST_ITEMS:
1968 break;
1969
1970 case ACTION_ZONES:
1971 zones_manager();
1972 break;
1973
1974 case ACTION_LOOT:
1975 loot();
1976 break;
1977
1978 case ACTION_INVENTORY:
1980 break;
1981
1982 case ACTION_COMPARE:
1984 break;
1985
1986 case ACTION_ORGANIZE:
1988 break;
1989
1990 case ACTION_USE:
1991 // Shell-users are presumed to be able to mess with their inventories, etc
1992 // while in the shell. Eating, gear-changing, and item use are OK.
1994 break;
1995
1996 case ACTION_USE_WIELDED:
1997 u.use_wielded();
1998 break;
1999
2000 case ACTION_WEAR:
2001 wear();
2002 break;
2003
2004 case ACTION_TAKE_OFF:
2005 takeoff();
2006 break;
2007
2008 case ACTION_EAT:
2009 if( !avatar_action::eat_here( u ) ) {
2011 }
2012 break;
2013
2015 if( !avatar_action::eat_here( u ) ) {
2017 }
2018 break;
2019
2020 case ACTION_READ:
2021 // Shell-users are presumed to have the book just at an opening and read it that way
2022 read();
2023 break;
2024
2025 case ACTION_WIELD:
2027 break;
2028
2029 case ACTION_PICK_STYLE:
2030 u.martial_arts_data->pick_style( u );
2031 break;
2032
2033 case ACTION_RELOAD_ITEM:
2035 break;
2036
2039 break;
2040
2043 break;
2044
2045 case ACTION_UNLOAD:
2047 break;
2048
2049 case ACTION_MEND:
2051 break;
2052
2053 case ACTION_THROW: {
2054 item_location loc;
2055 avatar_action::plthrow( g->u, loc );
2056 break;
2057 }
2058
2059 case ACTION_FIRE:
2060 fire();
2061 break;
2062
2063 case ACTION_CAST_SPELL:
2064 cast_spell();
2065 break;
2066
2067 case ACTION_FIRE_BURST: {
2068 if( u.weapon.gun_set_mode( gun_mode_id( "AUTO" ) ) ) {
2070 }
2071 break;
2072 }
2073
2075 if( u.is_armed() && u.weapon.is_gun() && !u.weapon.is_gunmod() ) {
2076 if( u.weapon.gun_all_modes().size() > 1 ) {
2078 } else {
2079 add_msg( m_info, _( "Your %s has only one firing mode." ), u.weapon.display_name() );
2080 }
2081 }
2082 break;
2083
2085 if( u.is_armed() && u.weapon.is_gun() && !u.weapon.is_gunmod() ) {
2087 }
2088 break;
2089
2090 case ACTION_DROP:
2091 // You CAN drop things to your own tile while in the shell.
2092 drop();
2093 break;
2094
2095 case ACTION_DIR_DROP:
2097 add_msg( m_info, _( "You can't drop things to another tile while you're in your shell." ) );
2098 } else {
2100 }
2101 break;
2102 case ACTION_BIONICS:
2103 show_bionics_ui( u );
2104 break;
2105 case ACTION_MUTATIONS:
2107 break;
2108
2109 case ACTION_SORT_ARMOR:
2110 u.sort_armor();
2111 break;
2112
2113 case ACTION_WAIT:
2114 wait();
2115 break;
2116
2117 case ACTION_CRAFT:
2119 add_msg( m_info, _( "You can't craft while you're in your shell." ) );
2120 } else if( u.is_mounted() ) {
2121 add_msg( m_info, _( "You can't craft while you're riding." ) );
2122 } else {
2123 u.craft();
2124 }
2125 break;
2126
2127 case ACTION_RECRAFT:
2129 add_msg( m_info, _( "You can't craft while you're in your shell." ) );
2130 } else if( u.is_mounted() ) {
2131 add_msg( m_info, _( "You can't craft while you're riding." ) );
2132 } else {
2133 u.recraft();
2134 }
2135 break;
2136
2137 case ACTION_LONGCRAFT:
2139 add_msg( m_info, _( "You can't craft while you're in your shell." ) );
2140 } else if( u.is_mounted() ) {
2141 add_msg( m_info, _( "You can't craft while you're riding." ) );
2142 } else {
2143 u.long_craft();
2144 }
2145 break;
2146
2147 case ACTION_DISASSEMBLE:
2148 if( u.controlling_vehicle ) {
2149 add_msg( m_info, _( "You can't disassemble items while driving." ) );
2150 } else if( u.is_mounted() ) {
2151 add_msg( m_info, _( "You can't disassemble items while you're riding." ) );
2152 } else {
2154 }
2155 break;
2156
2157 case ACTION_CONSTRUCT:
2158 if( u.in_vehicle ) {
2159 add_msg( m_info, _( "You can't construct while in a vehicle." ) );
2160 } else if( u.has_active_mutation( trait_SHELL2 ) ) {
2161 add_msg( m_info, _( "You can't construct while you're in your shell." ) );
2162 } else if( u.is_mounted() ) {
2163 add_msg( m_info, _( "You can't construct while you're riding." ) );
2164 } else {
2165 construction_menu( false );
2166 }
2167 break;
2168
2169 case ACTION_SLEEP:
2170 if( veh_ctrl ) {
2171 add_msg( m_info, _( "Vehicle control has moved, %s" ),
2172 press_x( ACTION_CONTROL_VEHICLE, _( "new binding is " ),
2173 _( "new default binding is '^'." ) ) );
2174 } else {
2175 sleep();
2176 }
2177 break;
2178
2181 add_msg( m_info, _( "You can't operate a vehicle while you're in your shell." ) );
2182 } else if( u.is_mounted() ) {
2183 u.dismount();
2184 } else {
2186 }
2187 break;
2188
2191 add_msg( m_info, auto_travel_mode ? _( "Auto travel mode ON!" ) : _( "Auto travel mode OFF!" ) );
2192 break;
2193
2195 if( safe_mode == SAFE_MODE_OFF ) {
2197 mostseen = 0;
2198 add_msg( m_info, _( "Safe mode ON!" ) );
2199 } else {
2202 add_msg( m_info, get_option<bool>( "AUTOSAFEMODE" )
2203 ? _( "Safe mode OFF! (Auto safe mode still enabled!)" ) : _( "Safe mode OFF!" ) );
2204 }
2208 }
2209 break;
2210
2212 auto &autosafemode_option = get_options().get_option( "AUTOSAFEMODE" );
2213 add_msg( m_info, autosafemode_option.value_as<bool>()
2214 ? _( "Auto safe mode OFF!" ) : _( "Auto safe mode ON!" ) );
2215 autosafemode_option.setNext();
2216 break;
2217 }
2218
2220 if( safe_mode == SAFE_MODE_STOP ) {
2221 add_msg( m_info, _( "Ignoring enemy!" ) );
2222 for( auto &elem : u.get_mon_visible().new_seen_mon ) {
2223 monster &critter = *elem;
2224 critter.ignoring = rl_dist( u.pos(), critter.pos() );
2225 }
2227 } else if( u.has_effect( effect_laserlocked ) ) {
2228 if( u.has_trait( trait_PROF_CHURL ) ) {
2229 add_msg( m_warning, _( "You make the sign of the cross." ) );
2230 } else {
2231 add_msg( m_info, _( "Ignoring laser targeting!" ) );
2232 }
2235 }
2236 break;
2237
2239 if( safe_mode == SAFE_MODE_STOP && !get_safemode().empty() ) {
2241 add_msg( m_info, _( "Creature whitelisted: %s" ), get_safemode().lastmon_whitelist );
2243 mostseen = 0;
2244 } else {
2245 get_safemode().show();
2246 }
2247 break;
2248
2249 case ACTION_SUICIDE:
2250 if( query_yn( _( "Commit suicide?" ) ) ) {
2251 if( query_yn( _( "REALLY commit suicide?" ) ) ) {
2252 u.apply_damage( &u, body_part_head, 99999 );
2253 u.moves = 0;
2254 u.place_corpse();
2256 }
2257 }
2258 break;
2259
2260 case ACTION_SAVE:
2261 if( query_yn( _( "Save and quit?" ) ) ) {
2262 if( save() ) {
2263 u.moves = 0;
2264 uquit = QUIT_SAVED;
2265 }
2266 }
2267 break;
2268
2269 case ACTION_QUICKSAVE:
2270 quicksave();
2271 return false;
2272
2273 case ACTION_QUICKLOAD:
2274 quickload();
2275 return false;
2276
2277 case ACTION_PL_INFO:
2279 break;
2280
2281 case ACTION_MAP:
2283 break;
2284
2285 case ACTION_SKY:
2286 if( m.is_outside( u.pos() ) ) {
2288 } else {
2289 add_msg( m_info, _( "You can't see the sky from here." ) );
2290 }
2291 break;
2292
2293 case ACTION_MISSIONS:
2294 list_missions();
2295 break;
2296
2297 case ACTION_SCORES:
2299 break;
2300
2301 case ACTION_DIARY:
2303 break;
2304
2305 case ACTION_FACTIONS:
2306 faction_manager_ptr->display();
2307 break;
2308
2309 case ACTION_MORALE:
2310 u.disp_morale();
2311 break;
2312
2313 case ACTION_MESSAGES:
2315 break;
2316
2317 case ACTION_HELP:
2319 break;
2320
2321 case ACTION_OPTIONS:
2322 get_options().show( true );
2323 break;
2324
2325 case ACTION_AUTOPICKUP:
2327 break;
2328
2329 case ACTION_AUTONOTES:
2331 break;
2332
2333 case ACTION_SAFEMODE:
2334 get_safemode().show();
2335 break;
2336
2339 break;
2340
2341 case ACTION_COLOR:
2342 all_colors.show_gui();
2343 break;
2344
2345 case ACTION_WORLD_MODS:
2346 world_generator->show_active_world_mods( world_generator->active_world->active_mod_order );
2347 break;
2348
2349 case ACTION_DEBUG:
2351 break; //don't do anything when sharing and not debugger
2352 }
2354 break;
2355
2358 break;
2359
2362 break;
2363
2366 break;
2367
2369 reload_tileset( []( std::string str ) {
2370 DebugLog( DL::Info, DC::Main ) << str;
2371 } );
2372 break;
2373
2375 get_options().get_option( "AUTO_FEATURES" ).setNext();
2376 get_options().save();
2377 //~ Auto Features are now ON/OFF
2378 add_msg( _( "%s are now %s." ),
2379 get_options().get_option( "AUTO_FEATURES" ).getMenuText(),
2380 get_option<bool>( "AUTO_FEATURES" ) ? _( "ON" ) : _( "OFF" ) );
2381 break;
2382
2384 get_options().get_option( "AUTO_PULP_BUTCHER" ).setNext();
2385 get_options().save();
2386 //~ Auto Pulp/Pulp Adjacent/Butcher is now set to x
2387 add_msg( _( "%s is now set to %s." ),
2388 get_options().get_option( "AUTO_PULP_BUTCHER" ).getMenuText(),
2389 get_options().get_option( "AUTO_PULP_BUTCHER" ).getValueName() );
2390 break;
2391
2393 get_options().get_option( "AUTO_MINING" ).setNext();
2394 get_options().save();
2395 //~ Auto Mining is now ON/OFF
2396 add_msg( _( "%s is now %s." ),
2397 get_options().get_option( "AUTO_MINING" ).getMenuText(),
2398 get_option<bool>( "AUTO_MINING" ) ? _( "ON" ) : _( "OFF" ) );
2399 break;
2400
2402 if( g->u.get_value( "THIEF_MODE" ) == "THIEF_ASK" ) {
2403 u.set_value( "THIEF_MODE", "THIEF_HONEST" );
2404 u.set_value( "THIEF_MODE_KEEP", "YES" );
2405 //~ Thief mode cycled between THIEF_ASK/THIEF_HONEST/THIEF_STEAL
2406 add_msg( _( "You will not pick up other peoples belongings." ) );
2407 } else if( g->u.get_value( "THIEF_MODE" ) == "THIEF_HONEST" ) {
2408 u.set_value( "THIEF_MODE", "THIEF_STEAL" );
2409 u.set_value( "THIEF_MODE_KEEP", "YES" );
2410 //~ Thief mode cycled between THIEF_ASK/THIEF_HONEST/THIEF_STEAL
2411 add_msg( _( "You will pick up also those things that belong to others!" ) );
2412 } else if( g->u.get_value( "THIEF_MODE" ) == "THIEF_STEAL" ) {
2413 u.set_value( "THIEF_MODE", "THIEF_ASK" );
2414 u.set_value( "THIEF_MODE_KEEP", "NO" );
2415 //~ Thief mode cycled between THIEF_ASK/THIEF_HONEST/THIEF_STEAL
2416 add_msg( _( "You will be reminded not to steal." ) );
2417 } else {
2418 // ERROR
2419 add_msg( _( "THIEF_MODE CONTAINED BAD VALUE [ %s ]!" ), g->u.get_value( "THIEF_MODE" ) );
2420 }
2421 break;
2422
2424 get_options().get_option( "AUTO_FORAGING" ).setNext();
2425 get_options().save();
2426 //~ Auto Foraging is now set to x
2427 add_msg( _( "%s is now set to %s." ),
2428 get_options().get_option( "AUTO_FORAGING" ).getMenuText(),
2429 get_options().get_option( "AUTO_FORAGING" ).getValueName() );
2430 break;
2431
2433 get_options().get_option( "AUTO_PICKUP" ).setNext();
2434 get_options().save();
2435 //~ Auto pickup is now set to x
2436 add_msg( _( "%s is now set to %s." ),
2437 get_options().get_option( "AUTO_PICKUP" ).getMenuText(),
2438 get_options().get_option( "AUTO_PICKUP" ).getValueName() );
2439 break;
2440
2443 break; //don't do anything when sharing and not debugger
2444 }
2445 display_scent();
2446 break;
2447
2450 break; //don't do anything when sharing and not debugger
2451 }
2452 display_scent();
2453 break;
2454
2457 break; //don't do anything when sharing and not debugger
2458 }
2460 break;
2463 break; //don't do anything when sharing and not debugger
2464 }
2466 break;
2469 break; //don't do anything when sharing and not debugger
2470 }
2472 break;
2473
2476 break; //don't do anything when sharing and not debugger
2477 }
2479 break;
2480
2483 break; //don't do anything when sharing and not debugger
2484 }
2486 break;
2487
2490 break; //don't do anything when sharing and not debugger
2491 }
2493 break;
2494
2496 g->debug_submap_grid_overlay = !g->debug_submap_grid_overlay;
2497 break;
2498
2501 break;
2502
2505 break; //don't do anything when sharing and not debugger
2506 }
2508 if( debug_mode ) {
2509 add_msg( m_info, _( "Debug mode ON!" ) );
2510 } else {
2511 add_msg( m_info, _( "Debug mode OFF!" ) );
2512 }
2513 break;
2514
2515 case ACTION_ZOOM_IN:
2516 zoom_in();
2518 break;
2519
2520 case ACTION_ZOOM_OUT:
2521 zoom_out();
2523 break;
2524
2525 case ACTION_ITEMACTION:
2527 break;
2528
2529 case ACTION_AUTOATTACK:
2531 break;
2532
2533 default:
2534 break;
2535 }
2536 }
2537 if( act != ACTION_TIMEOUT ) {
2538 u.mod_moves( -current_turn.moves_elapsed() );
2539 }
2540 gamemode->post_action( act );
2541
2542 u.movecounter = ( !u.is_dead_state() ? ( before_action_moves - u.moves ) : 0 );
2543 dbg( DL::Info ) << string_format( "%s: [%d] %d - %d = %d", action_ident( act ),
2544 to_turn<int>( calendar::turn ), before_action_moves, u.movecounter, u.moves );
2545 return ( !u.is_dead_state() );
2546}
cata::optional< std::string > press_x_if_bound(action_id act)
Definition: action.cpp:474
bool can_action_change_worldstate(const action_id act)
Lookup whether an action can affect the state of the game world.
Definition: action.cpp:352
action_id look_up_action(const std::string &ident)
Lookup an action ID by its unique string identifier.
Definition: action.cpp:423
action_id handle_main_menu()
Show in-game main menu.
Definition: action.cpp:947
point get_delta_from_movement_action(const action_id act, const iso_rotate rot)
Definition: action.cpp:512
action_id handle_action_menu()
Show the action menu.
Definition: action.cpp:660
@ ACTION_SAFEMODE
Open safemode manager.
Definition: action.h:267
@ ACTION_PEEK
Peek through something (e.g.
Definition: action.h:121
@ ACTION_OPEN
Open an item (e.g.
Definition: action.h:99
@ ACTION_CRAFT
Open crafting menu.
Definition: action.h:199
@ ACTION_DROP
Open the drop-item menu.
Definition: action.h:181
@ ACTION_READ
Open the read menu.
Definition: action.h:153
@ ACTION_TOGGLE_AUTO_PICKUP
Turn auto pickup on/off.
Definition: action.h:313
@ ACTION_MOVE_BACK_LEFT
Move towards bottom-left of screen / decelerate and steer left.
Definition: action.h:51
@ ACTION_ZOOM_IN
Zoom view out.
Definition: action.h:291
@ ACTION_EAT
Open the default consume item menu.
Definition: action.h:149
@ ACTION_SMASH
Smash something.
Definition: action.h:103
@ ACTION_ADVANCEDINV
Open the advanced inventory screen.
Definition: action.h:135
@ ACTION_QUICKSAVE
Quicksave the game.
Definition: action.h:227
@ ACTION_HELP
Display help screen.
Definition: action.h:253
@ ACTION_MESSAGES
Display messages screen.
Definition: action.h:251
@ ACTION_ZONES
Open the zone manager.
Definition: action.h:125
@ ACTION_TOGGLE_PIXEL_MINIMAP
Turn pixel minimap on/off.
Definition: action.h:297
@ ACTION_USE
Open the use menu.
Definition: action.h:141
@ ACTION_QUICKLOAD
Quickload the game.
Definition: action.h:229
@ ACTION_LIST_ITEMS
List items and monsters in a given square.
Definition: action.h:123
@ ACTION_DEBUG
Open debug menu.
Definition: action.h:281
@ ACTION_OPTIONS
Display options window.
Definition: action.h:261
@ ACTION_MOVE_FORTH
Move towards top of screen / accelerate.
Definition: action.h:41
@ ACTION_PICK_STYLE
Open the martial-arts style menu.
Definition: action.h:157
@ ACTION_CONSTRUCT
Open construct menu.
Definition: action.h:205
@ ACTION_MOVE_FORTH_RIGHT
Move towards top-right of screen / accelerate and steer right.
Definition: action.h:43
@ ACTION_SORT_ARMOR
Open the armor sorting menu.
Definition: action.h:189
@ ACTION_OPEN_CONSUME
Open the custom consume item menu.
Definition: action.h:151
@ ACTION_MORALE
Display morale effects screen.
Definition: action.h:249
@ ACTION_NULL
Invalid action used for various lookup errors.
Definition: action.h:24
@ ACTION_RESET_MOVE
Reset movement mode to walk
Definition: action.h:63
@ ACTION_CHAT
Chat with something.
Definition: action.h:117
@ ACTION_RELOAD_WIELDED
Attempt to reload wielded object.
Definition: action.h:163
@ ACTION_MOVE_DOWN
Descend a staircase.
Definition: action.h:57
@ ACTION_MISSIONS
Display missions screen.
Definition: action.h:243
@ ACTION_AUTONOTES
Open autonotes manager.
Definition: action.h:265
@ ACTION_WIELD
Open the wield menu.
Definition: action.h:155
@ ACTION_THROW
Open the throw menu.
Definition: action.h:169
@ ACTION_TOGGLE_AUTO_MINING
Turn auto mining on/off.
Definition: action.h:309
@ ACTION_INVENTORY
Open the primary inventory screen.
Definition: action.h:133
@ ACTION_TOGGLE_AUTOSAFE
Turn automatic triggering of safemode on/off.
Definition: action.h:217
@ ACTION_OPEN_MOVEMENT
Open movement mode menu.
Definition: action.h:69
@ ACTION_COMPARE
Open the item compare screen.
Definition: action.h:137
@ ACTION_SCORES
Display scores screen.
Definition: action.h:245
@ ACTION_BUTCHER
Butcher or disassemble objects in current square.
Definition: action.h:115
@ ACTION_SEC_SELECT
Click on a point with secondary mouse button (usually right button)
Definition: action.h:31
@ ACTION_TOGGLE_CROUCH
Toggle crouch on/off.
Definition: action.h:67
@ ACTION_TOGGLE_HOUR_TIMER
Toggle timing of the game hours.
Definition: action.h:329
@ ACTION_SELECT
Click on a point with primary mouse button (usually left button)
Definition: action.h:29
@ ACTION_MAIN_MENU
Display main menu.
Definition: action.h:255
@ ACTION_DISPLAY_SUBMAP_GRID
Toggle submap grid overlay.
Definition: action.h:327
@ ACTION_WAIT
Open wait menu.
Definition: action.h:197
@ ACTION_ACTIONMENU
Open the action menu.
Definition: action.h:293
@ ACTION_DISASSEMBLE
Open disassemble menu.
Definition: action.h:207
@ ACTION_LOOT
Sort out the loot.
Definition: action.h:127
@ ACTION_TOGGLE_FULLSCREEN
Toggle full-screen mode.
Definition: action.h:279
@ ACTION_MAP
Display over-map.
Definition: action.h:239
@ ACTION_MEND
Open the mending menu (e.g.
Definition: action.h:167
@ ACTION_TOGGLE_THIEF_MODE
Toggle permanent attitude to stealing.
Definition: action.h:219
@ ACTION_USE_WIELDED
Use currently wielded item.
Definition: action.h:143
@ ACTION_PL_INFO
Display player status screen.
Definition: action.h:237
@ ACTION_DISPLAY_SCENT_TYPE
Toggle scent type map.
Definition: action.h:285
@ ACTION_TOGGLE_AUTO_FORAGING
Turn auto foraging on/off.
Definition: action.h:311
@ ACTION_FIRE_BURST
Burst-fire the current weapon.
Definition: action.h:173
@ ACTION_BIONICS
Open the bionics menu.
Definition: action.h:185
@ ACTION_CONTROL_VEHICLE
Open vehicle control menu.
Definition: action.h:211
@ ACTION_SAVE
Save the game and quit.
Definition: action.h:225
@ ACTION_MOVE_UP
Ascend a staircase.
Definition: action.h:59
@ ACTION_TOGGLE_PANEL_ADM
Turn admin panel on/off.
Definition: action.h:299
@ ACTION_TOGGLE_AUTO_PULP_BUTCHER
Change auto pulp/butcher mode.
Definition: action.h:307
@ ACTION_TOGGLE_AUTO_TRAVEL_MODE
Turn auto travel mode on/off.
Definition: action.h:213
@ ACTION_COLOR
Open color manager.
Definition: action.h:269
@ ACTION_TIMEOUT
Input timeout.
Definition: action.h:39
@ ACTION_TOGGLE_RUN
Toggle run on/off.
Definition: action.h:65
@ ACTION_FACTIONS
Display factions screen.
Definition: action.h:247
@ ACTION_GRAB
Grab or let go of an object.
Definition: action.h:111
@ ACTION_MOVE_BACK
Move towards bottom of screen / decelerate.
Definition: action.h:49
@ ACTION_CAST_SPELL
Cast a spell (only if any spells are known)
Definition: action.h:179
@ ACTION_DIR_DROP
Drop items in a given direction.
Definition: action.h:183
@ ACTION_AUTOATTACK
Auto select and attack hostile creature within range.
Definition: action.h:191
@ ACTION_CYCLE_MOVE
Cycle run/walk/crouch mode.
Definition: action.h:61
@ ACTION_SKY
Show sky state for trying to predict weather.
Definition: action.h:241
@ ACTION_FIRE
Fire the wielded weapon, or open fire menu if none.
Definition: action.h:171
@ ACTION_PAUSE
Pause an on-going activity.
Definition: action.h:37
@ ACTION_MOVE_BACK_RIGHT
Move towards bottom-right of screen / decelerate and steer right.
Definition: action.h:47
@ ACTION_MUTATIONS
Open the mutations menu.
Definition: action.h:187
@ ACTION_HAUL
Haul pile of items, or let go of them.
Definition: action.h:113
@ ACTION_MOVE_RIGHT
Move / steer right.
Definition: action.h:45
@ ACTION_SLEEP
Open sleep menu.
Definition: action.h:209
@ ACTION_ITEMACTION
Open the item uses menu.
Definition: action.h:295
@ ACTION_MOVE_LEFT
Move / steer left.
Definition: action.h:53
@ ACTION_SELECT_DEFAULT_AMMO
Change default ammo for current weapon.
Definition: action.h:177
@ ACTION_AUTOPICKUP
Open autopickup manager.
Definition: action.h:263
@ ACTION_SUICIDE
Commit suicide.
Definition: action.h:231
@ NUM_ACTIONS
Not an action, serves as count of enumerated actions.
Definition: action.h:331
@ ACTION_ZOOM_OUT
Zoom view in.
Definition: action.h:289
@ ACTION_SELECT_FIRE_MODE
Change fire mode of the current weapon.
Definition: action.h:175
@ ACTION_UNLOAD
Open the unload item (e.g.
Definition: action.h:165
@ ACTION_RECRAFT
Repeat last craft command.
Definition: action.h:201
@ ACTION_TAKE_OFF
Open the take-off clothing selection menu.
Definition: action.h:147
@ ACTION_PICKUP_FEET
Pick up items from current square.
Definition: action.h:109
@ ACTION_TOGGLE_AUTO_FEATURES
Turn auto features on/off.
Definition: action.h:305
@ ACTION_WORLD_MODS
Open active world mods.
Definition: action.h:271
@ ACTION_TOGGLE_DEBUG_MODE
Toggle debug mode.
Definition: action.h:287
@ ACTION_ORGANIZE
Swap inventory letters.
Definition: action.h:139
@ ACTION_MOVE_FORTH_LEFT
Move towards top-left of screen / accelerate and steer left.
Definition: action.h:55
@ ACTION_RELOAD_TILESET
Reload current tileset.
Definition: action.h:303
@ ACTION_CLOSE
Close an item (e.g.
Definition: action.h:101
@ ACTION_RELOAD_WEAPON
Attempt to reload wielded weapon, then fall back to the load item select menu.
Definition: action.h:161
@ ACTION_RELOAD_ITEM
Open the load item (e.g.
Definition: action.h:159
@ ACTION_PICKUP
Pick up items from current/adjacent squares.
Definition: action.h:107
@ ACTION_LONGCRAFT
Open batch crafting menu.
Definition: action.h:203
@ ACTION_DISTRACTION_MANAGER
Open distraction manager.
Definition: action.h:273
@ ACTION_WEAR
Open the wear clothing selection menu.
Definition: action.h:145
@ ACTION_DIARY
Display diary window.
Definition: action.h:257
void create_advanced_inv()
auto_notes::auto_note_settings & get_auto_notes_settings()
Definition: auto_note.cpp:386
auto_pickup::player_settings & get_auto_pickup()
Definition: auto_pickup.cpp:38
void show_bionics_ui(Character &who)
Definition: bionics_ui.cpp:529
const bodypart_str_id body_part_head("head")
bool tile_iso
Using isometric tileset.
bool debug_mode
Extended debugging mode, can be toggled during game.
bool has_active_mutation(const trait_id &b) const
Definition: mutation.cpp:367
pimpl< character_martial_arts > martial_arts_data
Definition: character.h:1557
bool has_active_item(const itype_id &id) const
Whether the player carries an active item of the given item type.
Definition: character.cpp:2613
void place_corpse()
std::set< tripoint > get_path_avoid() const override
Returns a set of points we do not want to path through.
Definition: character.cpp:9856
bool has_destination_activity() const
bool is_auto_moving() const
void start_destination_activity()
action_id get_next_auto_move_direction()
const pathfinding_settings & get_pathfinding_settings() const override
Returns settings for pathfinding.
Definition: character.cpp:9870
bool is_armed() const
Returns true if the character is wielding something.
Definition: melee.cpp:145
void dismount()
Definition: character.cpp:1302
item weapon
Definition: character.h:1553
void set_value(const std::string &key, const std::string &value)
Definition: creature.cpp:1336
std::string get_value(const std::string &key) const
Definition: creature.cpp:1346
void mod_moves(int nmoves)
Definition: creature.cpp:1413
void cycle_move_mode()
Definition: avatar.cpp:1187
void toggle_map_memory()
Definition: avatar.cpp:122
void toggle_crouch_mode()
Definition: avatar.cpp:1171
void toggle_run_mode()
Definition: avatar.cpp:1162
void disp_morale()
Provides the window and detailed morale data.
Definition: avatar.cpp:1001
void reset_move_mode()
Definition: avatar.cpp:1180
static void show_diary_ui(diary *c_diary)
Definition: diary_ui.cpp:164
void item_action_menu()
void display_radiation()
Definition: game.cpp:11202
void list_missions()
Definition: mission_ui.cpp:22
input_context get_player_input(std::string &action)
bool try_get_left_click_action(action_id &act, const tripoint &mouse_target)
Definition: game.cpp:2289
void set_safe_mode(safe_mode_type mode)
Definition: game.cpp:8580
void reload_tileset(std::function< void(std::string)> out)
Definition: game.cpp:423
void pickup_feet()
Definition: game.cpp:5588
void zones_manager()
Definition: game.cpp:6058
int turnssincelastmon
Definition: game.h:1021
void display_visibility()
Definition: game.cpp:11116
void display_scent()
Definition: game.cpp:11081
bool save()
Returns false if saving failed.
Definition: game.cpp:2719
void butcher()
Definition: game.cpp:8262
void display_temperature()
Definition: game.cpp:11102
bool auto_travel_mode
Definition: game.h:1018
void zoom_out()
Definition: game.cpp:7008
void toggle_pixel_minimap()
Definition: game.cpp:412
void toggle_debug_hour_timer()
Definition: game.cpp:11148
void display_transparency()
Definition: game.cpp:11209
void list_items_monsters()
Definition: game.cpp:7186
cata::optional< tripoint > look_around(bool force_3d=false)
Definition: game.cpp:6533
void chat()
Definition: npctalk.cpp:395
void quickload()
Definition: game.cpp:11244
void pickup()
Definition: game.cpp:5566
void vertical_move(int z, bool force, bool peeking=false)
Moves the player vertically.
Definition: game.cpp:9929
void open_consume_item_menu()
void display_lighting()
Definition: game.cpp:11176
void control_vehicle()
Definition: game.cpp:5135
void peek()
Definition: game.cpp:5595
void drop()
Definition: game.cpp:8000
bool try_get_right_click_action(action_id &act, const tripoint &mouse_target)
Definition: game.cpp:2317
bool check_safe_mode_allowed(bool repeat_safe_mode_warnings=true)
Check whether movement is allowed according to safe mode settings.
Definition: game.cpp:8518
void zoom_in()
Definition: game.cpp:7020
void toggle_fullscreen()
Definition: game.cpp:402
void display_vehicle_ai()
Definition: game.cpp:11109
void mark_main_ui_adaptor_resize() const
Definition: game.cpp:2967
void drop_in_direction()
Definition: game.cpp:8005
void display_help()
Definition: help.cpp:140
cata::optional< tripoint > get_coordinates(const catacurses::window &capture_win_)
Get the coordinates associated with the last mouse click (if any).
Definition: input.cpp:1338
input_event get_raw_input()
Temporary method to retrieve the raw input received, so that input_contexts can be used in screens wh...
Definition: input.cpp:1299
action_id display_menu(bool permit_execute_action=false)
Displays the possible actions in the current context and their keybindings.
Definition: input.cpp:999
std::string get_keyname(int ch, input_event_t inp_type, bool portable=false) const
Get the key name associated with the given keyboard keycode.
Definition: input.cpp:415
bool is_gun() const
Can this item be used to perform a ranged attack?
Definition: item.cpp:6402
void gun_cycle_mode()
Switch to the next available firing mode.
Definition: item.cpp:7794
std::string display_name(unsigned int quantity=1) const
Returns the item name and the charges or contained charges (if the item can have charges at all).
Definition: item.cpp:4741
bool is_gunmod() const
Definition: item.cpp:6432
std::map< gun_mode_id, gun_mode > gun_all_modes() const
Get all possible modes for this gun inclusive of any attached gunmods.
Definition: item.cpp:7713
bool gun_set_mode(const gun_mode_id &mode)
Try to set the mode for a gun, returning false if no such mode is possible.
Definition: item.cpp:7785
bool is_outside(const tripoint &p) const
Definition: map.cpp:2574
std::vector< tripoint > route(const tripoint &f, const tripoint &t, const pathfinding_settings &settings, const std::set< tripoint > &pre_closed={{ }}) const
Calculate the best path using A*.
const tripoint & pos() const override
Definition: monster.cpp:256
short ignoring
Definition: monster.h:507
cOpt & get_option(const std::string &name)
Definition: options.cpp:3383
std::string show(bool ingame=false, bool world_options_only=false, const std::function< bool()> &on_quit=nullptr)
Definition: options.cpp:2765
void show_adm()
Definition: panels.cpp:2287
void craft(const tripoint &loc=tripoint_zero)
Start various types of crafts.
Definition: crafting.cpp:340
void sort_armor()
Draws the UI and handles player input for the armor re-ordering window.
void use_wielded()
Uses the current wielded weapon.
Definition: player.cpp:1948
int movecounter
Definition: player.h:477
void recraft(const tripoint &loc=tripoint_zero)
Definition: crafting.cpp:351
void long_craft(const tripoint &loc=tripoint_zero)
Definition: crafting.cpp:360
void add_rule(const std::string &rule_in, Creature::Attitude attitude_in, int proximity_in, rule_state state_in)
void show()
Definition: safemode_ui.cpp:39
int moves_elapsed()
#define all_colors
Definition: color.h:15
cata::optional< construction_id > construction_menu(const bool blueprint)
@ Info
Information (default: enabled).
@ Main
Generic messages related to game startup and operation.
#define DebugLog(lev, cl)
DebugLog.
Definition: debug.h:274
@ RULE_WHITELISTED
Definition: enums.h:53
@ SAFE_MODE_OFF
Definition: game.h:77
@ QUIT_SAVED
Definition: game.h:70
static void open_movement_mode_menu()
static void smash()
static void open()
#define dbg(x)
static void takeoff()
static void read()
static void wait()
static const efftype_id effect_laserlocked("laserlocked")
static void rcdrive(const point &d)
static void wear()
static void close()
static const bionic_id bio_remote("bio_remote")
static void pldrive(const tripoint &p)
static void haul()
static const trait_id trait_SHELL2("SHELL2")
static const trait_id trait_PROF_CHURL("PROF_CHURL")
static void cast_spell()
static void loot()
static void fire()
static void grab()
static void sleep()
static const itype_id itype_radiocontrol("radiocontrol")
help & get_help()
Definition: help.cpp:30
void show_mutations_ui(Character &who)
bool isDebugger()
Definition: mapsharing.cpp:65
bool isCompetitive()
Definition: mapsharing.cpp:35
void reload_wielded(bool prompt=false)
Reload wielded item.
void reload_item()
Prompt to reload some item.
void use_item(avatar &you, item_location &loc)
bool eat_here(avatar &you)
void wield()
Prompt to wield some item.
void autoattack(avatar &you, map &m)
void eat(avatar &you)
Eat food or fuel 'E' (or 'a')
void fire_wielded_weapon(avatar &you)
Checks if the wielded weapon is a gun and can be fired then starts interactive aiming.
void plthrow(avatar &you, item_location loc, const cata::optional< tripoint > &blind_throw_from_pos=cata::nullopt)
void reload_weapon(bool try_everything=true)
Reload a wielded gun/tool.
void mend(avatar &you, item_location loc)
void unload(avatar &you)
Prompts to unload some item.
void disp_info(Character &ch)
Handles and displays detailed character info for the '@' screen.
void do_pause(Character &who)
Do pause action ('.
void debug()
void close_door(map &m, Character &who, const tripoint &closep)
Handles deducting moves, printing messages (only non-NPCs cause messages), actually closing it,...
Definition: gates.cpp:256
void compare(player &p, const cata::optional< tripoint > &offset)
void common(avatar &you)
void swap_letters(player &p)
void prompt_select_default_ammo_for(avatar &u, const item &w)
Prompts to select default ammo compatible with provided gun.
Definition: ranged.cpp:3756
void display_visible_weather()
Display overmap like with display() and display the weather that is within line of sight.
void display()
Display overmap centered at the player's position.
options_manager & get_options()
Definition: options.cpp:142
T get_option(const std::string &name)
Definition: options.h:368
static constexpr point point_south_west
Definition: point.h:281
static constexpr point point_north_east
Definition: point.h:277
static constexpr point point_north_west
Definition: point.h:283
An instance of an input, like a keypress etc.
Definition: input.h:95
std::vector< int > sequence
Definition: input.h:101
int get_first_input() const
Definition: input.cpp:100
input_event_t type
Definition: input.h:96
void handbrake()

References _, Creature::A_ANY, achievements_tracker_ptr, act, action, ACTION_ACTIONMENU, ACTION_ADVANCEDINV, ACTION_AUTOATTACK, ACTION_AUTONOTES, ACTION_AUTOPICKUP, ACTION_BIONICS, ACTION_BUTCHER, ACTION_CAST_SPELL, ACTION_CENTER, ACTION_CHAT, ACTION_CLOSE, ACTION_COLOR, ACTION_COMPARE, ACTION_CONSTRUCT, ACTION_CONTROL_VEHICLE, ACTION_CRAFT, ACTION_CYCLE_MOVE, ACTION_DEBUG, ACTION_DIARY, ACTION_DIR_DROP, ACTION_DISASSEMBLE, ACTION_DISPLAY_LIGHTING, ACTION_DISPLAY_RADIATION, ACTION_DISPLAY_SCENT, ACTION_DISPLAY_SCENT_TYPE, ACTION_DISPLAY_SUBMAP_GRID, ACTION_DISPLAY_TEMPERATURE, ACTION_DISPLAY_TRANSPARENCY, ACTION_DISPLAY_VEHICLE_AI, ACTION_DISPLAY_VISIBILITY, ACTION_DISTRACTION_MANAGER, ACTION_DROP, ACTION_EAT, ACTION_EXAMINE, ACTION_FACTIONS, ACTION_FIRE, ACTION_FIRE_BURST, ACTION_GRAB, ACTION_HAUL, ACTION_HELP, action_ident(), ACTION_IGNORE_ENEMY, ACTION_INVENTORY, ACTION_ITEMACTION, ACTION_KEYBINDINGS, ACTION_LIST_ITEMS, ACTION_LONGCRAFT, ACTION_LOOK, ACTION_LOOT, ACTION_MAIN_MENU, ACTION_MAP, ACTION_MEND, ACTION_MESSAGES, ACTION_MISSIONS, ACTION_MORALE, ACTION_MOVE_BACK, ACTION_MOVE_BACK_LEFT, ACTION_MOVE_BACK_RIGHT, ACTION_MOVE_DOWN, ACTION_MOVE_FORTH, ACTION_MOVE_FORTH_LEFT, ACTION_MOVE_FORTH_RIGHT, ACTION_MOVE_LEFT, ACTION_MOVE_RIGHT, ACTION_MOVE_UP, ACTION_MUTATIONS, ACTION_NULL, ACTION_OPEN, ACTION_OPEN_CONSUME, ACTION_OPEN_MOVEMENT, ACTION_OPTIONS, ACTION_ORGANIZE, ACTION_PAUSE, ACTION_PEEK, ACTION_PICK_STYLE, ACTION_PICKUP, ACTION_PICKUP_FEET, ACTION_PL_INFO, ACTION_QUICKLOAD, ACTION_QUICKSAVE, ACTION_READ, ACTION_RECRAFT, ACTION_RELOAD_ITEM, ACTION_RELOAD_TILESET, ACTION_RELOAD_WEAPON, ACTION_RELOAD_WIELDED, ACTION_RESET_MOVE, ACTION_SAFEMODE, ACTION_SAVE, ACTION_SCORES, ACTION_SEC_SELECT, ACTION_SELECT, ACTION_SELECT_DEFAULT_AMMO, ACTION_SELECT_FIRE_MODE, ACTION_SHIFT_E, ACTION_SHIFT_N, ACTION_SHIFT_NE, ACTION_SHIFT_NW, ACTION_SHIFT_S, ACTION_SHIFT_SE, ACTION_SHIFT_SW, ACTION_SHIFT_W, ACTION_SKY, ACTION_SLEEP, ACTION_SMASH, ACTION_SORT_ARMOR, ACTION_SUICIDE, ACTION_TAKE_OFF, ACTION_THROW, ACTION_TIMEOUT, ACTION_TOGGLE_AUTO_FEATURES, ACTION_TOGGLE_AUTO_FORAGING, ACTION_TOGGLE_AUTO_MINING, ACTION_TOGGLE_AUTO_PICKUP, ACTION_TOGGLE_AUTO_PULP_BUTCHER, ACTION_TOGGLE_AUTO_TRAVEL_MODE, ACTION_TOGGLE_AUTOSAFE, ACTION_TOGGLE_CROUCH, ACTION_TOGGLE_DEBUG_MODE, ACTION_TOGGLE_FULLSCREEN, ACTION_TOGGLE_HOUR_TIMER, ACTION_TOGGLE_MAP_MEMORY, ACTION_TOGGLE_PANEL_ADM, ACTION_TOGGLE_PIXEL_MINIMAP, ACTION_TOGGLE_RUN, ACTION_TOGGLE_SAFEMODE, ACTION_TOGGLE_THIEF_MODE, ACTION_UNLOAD, ACTION_USE, ACTION_USE_WIELDED, ACTION_WAIT, ACTION_WEAR, ACTION_WHITELIST_ENEMY, ACTION_WIELD, ACTION_WORLD_MODS, ACTION_ZONES, ACTION_ZOOM_IN, ACTION_ZOOM_OUT, add_msg(), safemode::add_rule(), all_colors, Character::apply_damage(), auto_travel_mode, avatar_action::autoattack(), bio_remote, body_part_head, butcher(), can_action_change_worldstate(), cast_spell(), chat(), check_safe_mode_allowed(), Character::clear_destination(), close(), doors::close_door(), game_menus::inv::common(), game_menus::inv::compare(), construction_menu(), control_vehicle(), Character::controlling_vehicle, player::craft(), create_advanced_inv(), avatar::cycle_move_mode(), dbg, debug_menu::debug(), debug_mode, DebugLog, destination_preview, crafting::disassemble(), Character::dismount(), character_display::disp_info(), avatar::disp_morale(), ui::omap::display(), help::display_help(), display_lighting(), input_context::display_menu(), Messages::display_messages(), item::display_name(), display_radiation(), display_scent(), display_temperature(), display_transparency(), display_vehicle_ai(), display_visibility(), ui::omap::display_visible_weather(), character_funcs::do_pause(), driving_view_offset, drop(), drop_in_direction(), avatar_action::eat(), avatar_action::eat_here(), effect_laserlocked, examine(), faction_manager_ptr, fire(), avatar_action::fire_wielded_weapon(), g, gamemode, get_auto_notes_settings(), get_auto_pickup(), avatar::get_avatar_diary(), input_context::get_coordinates(), get_delta_from_movement_action(), get_distraction_manager(), input_event::get_first_input(), get_help(), input_manager::get_keyname(), get_kill_tracker(), panel_manager::get_manager(), avatar::get_mon_visible(), Character::get_next_auto_move_direction(), options_manager::get_option(), get_option(), get_options(), Character::get_path_avoid(), Character::get_pathfinding_settings(), get_player_input(), input_context::get_raw_input(), get_safemode(), Creature::get_value(), grab(), item::gun_all_modes(), item::gun_cycle_mode(), item::gun_set_mode(), handbrake(), handle_action_menu(), handle_main_menu(), Character::has_active_bionic(), Character::has_active_item(), Character::has_active_mutation(), Character::has_destination(), Character::has_destination_activity(), Creature::has_effect(), Character::has_trait(), haul(), monster::ignoring, Character::in_vehicle, Info, inp_mngr, Character::is_armed(), Character::is_auto_moving(), Character::is_dead_state(), item::is_gun(), item::is_gunmod(), Character::is_mounted(), map::is_outside(), MAP_SHARING::isCompetitive(), MAP_SHARING::isDebugger(), item_action_menu(), itype_radiocontrol, list_items_monsters(), list_missions(), player::long_craft(), look_around(), look_up_action(), loot(), m, m_bad, m_info, m_warning, Main, mark_main_ui_adaptor_resize(), Character::martial_arts_data, avatar_action::mend(), MF_RIDEABLE_MECH, Creature::mod_moves(), mostseen, Character::mounted_creature, avatar_action::move(), player::movecounter, Creature::moves, user_turn::moves_elapsed(), om_direction::name(), monster_visible_info::new_seen_mon, no, cata::nullopt, NUM_ACTIONS, open(), open_consume_item_menu(), open_movement_mode_menu(), peek(), pickup(), pickup_feet(), Character::place_corpse(), pldrive(), avatar_action::plthrow(), point_east, point_north, point_north_east, point_north_west, point_south, point_south_east, point_south_west, point_west, point_zero, Character::pos(), monster::pos(), Character::posx(), Character::posy(), Character::posz(), press_x(), press_x_if_bound(), ranged::prompt_select_default_ammo_for(), query_yn(), quickload(), quicksave(), QUIT_DIED, QUIT_SAVED, QUIT_SUICIDE, QUIT_WATCH, rcdrive(), read(), player::recraft(), avatar_action::reload_item(), reload_tileset(), avatar_action::reload_weapon(), avatar_action::reload_wielded(), remoteveh(), Creature::remove_effect(), avatar::reset_move_mode(), rl_dist(), map::route(), RULE_WHITELISTED, safe_mode, SAFE_MODE_OFF, SAFE_MODE_ON, SAFE_MODE_STOP, safe_mode_warning_logged, save(), options_manager::save(), Character::sees(), SEEX, input_event::sequence, Character::set_destination(), set_safe_mode(), Creature::set_value(), options_manager::cOpt::setNext(), auto_pickup::player_settings::show(), distraction_manager::distraction_manager_gui::show(), safemode::show(), options_manager::show(), panel_manager::show_adm(), show_bionics_ui(), diary::show_diary_ui(), auto_notes::auto_note_settings::show_gui(), show_mutations_ui(), show_scores_ui(), sleep(), smash(), player::sort_armor(), Character::start_destination_activity(), stats(), string_format(), game_menus::inv::swap_letters(), takeoff(), tile_iso, avatar::toggle_crouch_mode(), toggle_debug_hour_timer(), toggle_fullscreen(), avatar::toggle_map_memory(), toggle_pixel_minimap(), avatar::toggle_run_mode(), trait_PROF_CHURL, trait_SHELL2, tripoint_above, tripoint_below, try_get_left_click_action(), try_get_right_click_action(), calendar::turn, turnssincelastmon, input_event::type, u, avatar_action::unload(), uquit, avatar_action::use_item(), use_tiles, player::use_wielded(), user_action_counter, map::veh_at(), vertical_move(), player::view_offset, w_terrain, wait(), Character::weapon, wear(), avatar_action::wield(), world_generator, point::x, tripoint::x, point::y, tripoint::y, yes, zones_manager(), zoom_in(), and zoom_out().

Referenced by do_turn().

◆ handle_key_blocking_activity()

void game::handle_key_blocking_activity ( )
private

Definition at line 1968 of file game.cpp.

1969{
1971 const std::string action = ctxt.handle_input( 0 );
1972 bool refresh = true;
1973 if( action == "pause" ) {
1975 cancel_activity_query( _( "Confirm:" ) );
1976 }
1977 } else if( action == "player_data" ) {
1979 } else if( action == "messages" ) {
1981 } else if( action == "help" ) {
1983 } else if( action != "HELP_KEYBINDINGS" ) {
1984 refresh = false;
1985 }
1986 if( refresh ) {
1989 }
1990}
bool cancel_activity_query(const std::string &text)
Asks if the player wants to cancel their activity, and if so cancels it.
Definition: game.cpp:1752
const std::string & handle_input()
Handles input and returns the next action in the queue.
Definition: input.cpp:854
bool interruptable_with_kb
Controls whether this activity can be cancelled with 'pause' action.
void refresh()

References _, action, Character::activity, cancel_activity_query(), character_display::disp_info(), help::display_help(), Messages::display_messages(), get_default_mode_input_context(), get_help(), input_context::handle_input(), player_activity::interruptable_with_kb, ui_manager::redraw(), catacurses::refresh(), refresh_display(), and u.

Referenced by process_voluntary_act_interrupt().

◆ handle_mouseview()

bool game::handle_mouseview ( input_context ctxt,
std::string &  action 
)
private

Definition at line 1994 of file game.cpp.

1995{
1996 cata::optional<tripoint> liveview_pos;
1997
1998 do {
1999 action = ctxt.handle_input();
2000 if( action == "MOUSE_MOVE" ) {
2001 const cata::optional<tripoint> mouse_pos = ctxt.get_coordinates( w_terrain );
2002 if( mouse_pos && ( !liveview_pos || *mouse_pos != *liveview_pos ) ) {
2003 liveview_pos = mouse_pos;
2004 liveview.show( *liveview_pos );
2005 } else if( !mouse_pos ) {
2006 liveview_pos.reset();
2007 liveview.hide();
2008 }
2010 }
2011 } while( action == "MOUSE_MOVE" ); // Freeze animation when moving the mouse
2012
2013 if( action != "TIMEOUT" ) {
2014 // Keyboard event, break out of animation loop
2015 liveview.hide();
2016 return false;
2017 }
2018
2019 // Mouse movement or un-handled key
2020 return true;
2021}
void reset() noexcept
Definition: optional.h:158
void hide()
Definition: live_view.cpp:33
void show(const tripoint &p)
Definition: live_view.cpp:38

References action, input_context::get_coordinates(), input_context::handle_input(), live_view::hide(), liveview, ui_manager::redraw(), cata::optional< T >::reset(), live_view::show(), and w_terrain.

Referenced by get_player_input().

◆ has_gametype()

bool game::has_gametype ( ) const

Definition at line 526 of file game.cpp.

527{
528 return gamemode && gamemode->id() != SGAME_NULL;
529}

References gamemode, and SGAME_NULL.

◆ init_autosave()

void game::init_autosave ( )
private

Definition at line 11216 of file game.cpp.

11217{
11219 last_save_timestamp = time( nullptr );
11220}

References last_save_timestamp, and moves_since_last_save.

Referenced by load(), and start_game().

◆ inv_map_splice()

item_location game::inv_map_splice ( item_filter  filter,
const std::string &  title,
int  radius = 0,
const std::string &  none_message = "" 
)

Custom-filtered menu for inventory and nearby items and those that within specified radius.

Definition at line 397 of file game_inventory.cpp.

399{
401 title, radius, none_message );
402}
static item_location_filter convert_filter(const item_filter &filter)
static item_location inv_internal(player &u, const inventory_selector_preset &preset, const std::string &title, int radius, const std::string &none_message, const std::string &hint=std::string())
std::string title(holiday current_holiday)
Definition: path_info.cpp:334

References convert_filter(), inv_internal(), PATH_INFO::title(), and u.

◆ invalidate_main_ui_adaptor()

void game::invalidate_main_ui_adaptor ( ) const

◆ is_dangerous_tile()

bool game::is_dangerous_tile ( const tripoint dest_loc) const

Definition at line 8648 of file game.cpp.

8649{
8650 return !( get_dangerous_tile( dest_loc ).empty() );
8651}
std::vector< std::string > get_dangerous_tile(const tripoint &dest_loc) const
Definition: game.cpp:8670

References get_dangerous_tile().

Referenced by walk_move().

◆ is_empty()

bool game::is_empty ( const tripoint p)

Returns true if there is no player, NPC, or monster on the tile and move_cost > 0.

Definition at line 4799 of file game.cpp.

4800{
4801 return ( m.passable( p ) || m.has_flag( "LIQUID", p ) ) &&
4802 critter_at( p ) == nullptr;
4803}

References critter_at(), map::has_flag(), m, and map::passable().

Referenced by grabbed_furn_move(), monmove(), place_player(), and update_stair_monsters().

◆ is_game_over()

bool game::is_game_over ( )
private

Definition at line 2362 of file game.cpp.

2363{
2364 if( uquit == QUIT_WATCH ) {
2365 // deny player movement and dodging
2366 u.moves = 0;
2367 // prevent pain from updating
2368 u.set_pain( 0 );
2369 // prevent dodging
2370 u.dodges_left = 0;
2371 return false;
2372 }
2373 if( uquit == QUIT_DIED ) {
2374 if( u.in_vehicle ) {
2375 m.unboard_vehicle( u.pos() );
2376 }
2377 u.place_corpse();
2378 return true;
2379 }
2380 if( uquit == QUIT_SUICIDE ) {
2381 if( u.in_vehicle ) {
2382 m.unboard_vehicle( u.pos() );
2383 }
2384 return true;
2385 }
2386 if( uquit != QUIT_NO ) {
2387 return true;
2388 }
2389 // is_dead_state() already checks hp_torso && hp_head, no need to for loop it
2390 if( u.is_dead_state() ) {
2392 if( get_option<std::string>( "DEATHCAM" ) == "always" ) {
2393 uquit = QUIT_WATCH;
2394 } else if( get_option<std::string>( "DEATHCAM" ) == "ask" ) {
2395 uquit = query_yn( _( "Watch the last moments of your life…?" ) ) ?
2397 } else if( get_option<std::string>( "DEATHCAM" ) == "never" ) {
2398 uquit = QUIT_DIED;
2399 } else {
2400 // Something funky happened here, just die.
2401 dbg( DL::Error ) << "no deathcam option given to options, defaulting to QUIT_DIED";
2402 uquit = QUIT_DIED;
2403 }
2404 return is_game_over();
2405 }
2406 return false;
2407}
int dodges_left
Definition: character.h:590
void set_pain(int npain) override
Sets new intensity of pain an reacts to it.
Definition: character.cpp:911
@ Error
Error (default: enabled).
#define dbg(x)
Definition: game.cpp:195
void deactivate()
Definition: messages.cpp:357

References _, dbg, Messages::deactivate(), Character::dodges_left, Error, Character::in_vehicle, Character::is_dead_state(), is_game_over(), m, Creature::moves, Character::place_corpse(), Character::pos(), query_yn(), QUIT_DIED, QUIT_NO, QUIT_SUICIDE, QUIT_WATCH, Character::set_pain(), u, map::unboard_vehicle(), and uquit.

Referenced by do_turn(), and is_game_over().

◆ is_hostile_nearby()

Creature * game::is_hostile_nearby ( )

Definition at line 3558 of file game.cpp.

3559{
3560 int distance = ( get_option<int>( "SAFEMODEPROXIMITY" ) <= 0 ) ? MAX_VIEW_DISTANCE :
3561 get_option<int>( "SAFEMODEPROXIMITY" );
3562 return is_hostile_within( distance );
3563}
Creature * is_hostile_within(int distance)
Definition: game.cpp:3570

References is_hostile_within(), and MAX_VIEW_DISTANCE.

◆ is_hostile_very_close()

Creature * game::is_hostile_very_close ( )

Definition at line 3565 of file game.cpp.

3566{
3568}
static constexpr int DANGEROUS_PROXIMITY
Definition: game.cpp:197

References DANGEROUS_PROXIMITY, and is_hostile_within().

Referenced by butcher(), and process_voluntary_act_interrupt().

◆ is_hostile_within()

Creature * game::is_hostile_within ( int  distance)
private

Definition at line 3570 of file game.cpp.

3571{
3572 for( auto &critter : u.get_visible_creatures( distance ) ) {
3573 if( u.attitude_to( *critter ) == Creature::A_HOSTILE ) {
3574 return critter;
3575 }
3576 }
3577
3578 return nullptr;
3579}
Attitude attitude_to(const Creature &other) const override
Attitude (of this creature) towards another creature.
std::vector< Creature * > get_visible_creatures(int range) const
Returns all creatures that this player can see and that are in the given range.
@ A_HOSTILE
Definition: creature.h:169

References Creature::A_HOSTILE, Character::attitude_to(), Character::get_visible_creatures(), and u.

Referenced by is_hostile_nearby(), and is_hostile_very_close().

◆ is_in_sunlight()

bool game::is_in_sunlight ( const tripoint p)

Returns true if p is outdoors and it is sunny.

Definition at line 4805 of file game.cpp.

4806{
4807 return weather::is_in_sunlight( m, p, get_weather().weather_id );
4808}
bool is_in_sunlight(const map &m, const tripoint &p, const weather_type_id &weather)
Definition: weather.cpp:1162

References get_weather, weather::is_in_sunlight(), and m.

Referenced by process_artifact().

◆ is_in_viewport()

bool game::is_in_viewport ( const tripoint p,
int  margin = 0 
) const

Definition at line 3204 of file game.cpp.

3205{
3206 const tripoint diff( u.pos() + u.view_offset - p );
3207
3208 return ( std::abs( diff.x ) <= getmaxx( w_terrain ) / 2 - margin ) &&
3209 ( std::abs( diff.y ) <= getmaxy( w_terrain ) / 2 - margin );
3210}

References catacurses::getmaxx(), catacurses::getmaxy(), Character::pos(), u, player::view_offset, w_terrain, tripoint::x, and tripoint::y.

◆ is_sheltered()

bool game::is_sheltered ( const tripoint p)

Returns true if p is indoors, underground, or in a car.

Definition at line 4810 of file game.cpp.

4811{
4812 return weather::is_sheltered( m, p );
4813}
bool is_sheltered(const map &m, const tripoint &p)
Definition: weather.cpp:1153

References weather::is_sheltered(), and m.

◆ is_zones_manager_open()

bool game::is_zones_manager_open ( ) const

Definition at line 5988 of file game.cpp.

5989{
5990 return zones_manager_open;
5991}
bool zones_manager_open
Is Zone manager open or not - changes graphics of some zone tiles.
Definition: game.h:1053

References zones_manager_open.

◆ item_action_menu()

void game::item_action_menu ( )
private

Definition at line 231 of file item_action.cpp.

232{
233 const auto &gen = item_action_generator::generator();
234 const action_map &item_actions = gen.get_item_action_map();
235
236 // HACK: A bit of a hack for now. If more pseudos get implemented, this should be un-hacked
237 std::vector<item *> pseudos;
238 item toolset( "toolset", calendar::turn );
239 if( u.has_active_bionic( bio_tools ) ) {
240 pseudos.push_back( &toolset );
241 }
242 item bio_claws_item( static_cast<std::string>( bio_claws_weapon ), calendar::turn );
243 if( u.has_active_bionic( bio_claws ) ) {
244 pseudos.push_back( &bio_claws_item );
245 }
246
247 item_action_map iactions = gen.map_actions_to_items( u, pseudos );
248 if( iactions.empty() ) {
249 popup( _( "You don't have any items with registered uses" ) );
250 }
251
252 uilist kmenu;
253 kmenu.text = _( "Execute which action?" );
254 kmenu.input_category = "ITEM_ACTIONS";
255 input_context ctxt( "ITEM_ACTIONS" );
256 for( const auto &id : item_actions ) {
257 ctxt.register_action( id.first, id.second.name );
258 kmenu.additional_actions.emplace_back( id.first, id.second.name );
259 }
260 actmenu_cb callback( item_actions );
261 kmenu.callback = &callback;
262 int num = 0;
263
264 const auto assigned_action = [&iactions]( const item_action_id & action ) {
265 return iactions.find( action ) != iactions.end();
266 };
267
268 std::vector<std::tuple<item_action_id, std::string, std::string>> menu_items;
269 // Sorts menu items by action.
270 using Iter = decltype( menu_items )::iterator;
271 const auto sort_menu = []( Iter from, Iter to ) {
272 std::sort( from, to, []( const std::tuple<item_action_id, std::string, std::string> &lhs,
273 const std::tuple<item_action_id, std::string, std::string> &rhs ) {
274 return std::get<1>( lhs ).compare( std::get<1>( rhs ) ) < 0;
275 } );
276 };
277 // Add mapped actions to the menu vector.
278 std::transform( iactions.begin(), iactions.end(), std::back_inserter( menu_items ),
279 []( const std::pair<item_action_id, item *> &elem ) {
280 std::string ss = elem.second->display_name();
281 if( elem.second->ammo_required() ) {
282 ss += string_format( " (%d/%d)", elem.second->ammo_required(), elem.second->ammo_remaining() );
283 }
284
285 const auto method = elem.second->get_use( elem.first );
286 if( method ) {
287 return std::make_tuple( method->get_type(), method->get_name(), ss );
288 } else {
289 return std::make_tuple( errstring, std::string( "NO USE FUNCTION" ), ss );
290 }
291 } );
292 // Sort mapped actions.
293 sort_menu( menu_items.begin(), menu_items.end() );
294 // Add unmapped but binded actions to the menu vector.
295 for( const auto &elem : item_actions ) {
296 if( key_bound_to( ctxt, elem.first ) != '\0' && !assigned_action( elem.first ) ) {
297 menu_items.emplace_back( elem.first, gen.get_action_name( elem.first ), "-" );
298 }
299 }
300 // Sort unmapped actions.
301 auto iter = menu_items.begin();
302 std::advance( iter, iactions.size() );
303 sort_menu( iter, menu_items.end() );
304 // Determine max lengths, to print the menu nicely.
305 std::pair<int, int> max_len;
306 for( const auto &elem : menu_items ) {
307 max_len.first = std::max( max_len.first, utf8_width( std::get<1>( elem ), true ) );
308 max_len.second = std::max( max_len.second, utf8_width( std::get<2>( elem ), true ) );
309 }
310 // Fill the menu.
311 for( const auto &elem : menu_items ) {
312 std::string ss;
313 ss += std::get<1>( elem );
314 ss += std::string( max_len.first - utf8_width( std::get<1>( elem ), true ), ' ' );
315 ss += std::string( 4, ' ' );
316
317 ss += std::get<2>( elem );
318 ss += std::string( max_len.second - utf8_width( std::get<2>( elem ), true ), ' ' );
319
320 const char bind = key_bound_to( ctxt, std::get<0>( elem ) );
321 const bool enabled = assigned_action( std::get<0>( elem ) );
322
323 kmenu.addentry( num, enabled, bind, ss );
324 num++;
325 }
326
327 kmenu.query();
328 if( kmenu.ret < 0 || kmenu.ret >= static_cast<int>( iactions.size() ) ) {
329 return;
330 }
331
332 const item_action_id action = std::get<0>( menu_items[kmenu.ret] );
333 item *it = iactions[action];
334
335 u.invoke_item( it, action );
336
337 u.inv.restack( u );
338 u.inv.unsort();
339}
inventory inv
Definition: character.h:1551
bool invoke_item(item *, const tripoint &pt) override
Asks how to use the item (if it has more than one use_method) and uses it.
Definition: avatar.cpp:1256
void restack(player &p)
Definition: inventory.cpp:399
void unsort()
Definition: inventory.cpp:227
static item_action_generator & generator()
Definition: item_action.h:32
std::string input_category
Definition: ui.h:325
std::vector< std::pair< std::string, translation > > additional_actions
Definition: ui.h:326
static char key_bound_to(const input_context &ctxt, const item_action_id &act)
Definition: item_action.cpp:47
static const bionic_id bio_claws("bio_claws")
static const bionic_id bio_tools("bio_tools")
static const bionic_id bio_claws_weapon("bio_claws_weapon")
std::string item_action_id
Definition: item_action.h:16
std::map< item_action_id, item_action > action_map
Definition: item_action.h:18
std::map< item_action_id, item * > item_action_map
Definition: item_action.h:17

References _, action, uilist::additional_actions, bio_claws, bio_claws_weapon, bio_tools, uilist::callback, item_action_generator::generator(), Character::has_active_bionic(), uilist::input_category, num, popup(), input_context::register_action(), second, uilist::text, iexamine::transform(), calendar::turn, and u.

Referenced by handle_action().

◆ knockback() [1/2]

void game::knockback ( const tripoint s,
const tripoint t,
int  force,
int  stun,
int  dam_mult,
Creature source 
)

Definition at line 4222 of file game.cpp.

4224{
4225 std::vector<tripoint> traj;
4226 traj.clear();
4227 traj = line_to( s, t, 0, 0 );
4228 traj.insert( traj.begin(), s ); // how annoying, line_to() doesn't include the originating point!
4229 traj = continue_line( traj, force );
4230 traj.insert( traj.begin(), t ); // how annoying, continue_line() doesn't either!
4231
4232 knockback( traj, stun, dam_mult, source );
4233}
std::vector< coords::coord_point< Point, Origin, Scale > > line_to(const coords::coord_point< Point, Origin, Scale > &loc1, const coords::coord_point< Point, Origin, Scale > &loc2)
Definition: coordinates.h:548
std::vector< tripoint > continue_line(const std::vector< tripoint > &line, const int distance)
Definition: line.cpp:408

References continue_line(), knockback(), and line_to().

Referenced by forced_door_closing(), and knockback().

◆ knockback() [2/2]

void game::knockback ( std::vector< tripoint > &  traj,
int  stun,
int  dam_mult,
Creature source = nullptr 
)

Definition at line 4239 of file game.cpp.

4241{
4242 // TODO: make the force parameter actually do something.
4243 // the header file says higher force causes more damage.
4244 // perhaps that is what it should do?
4245
4246 // TODO: refactor this so it's not copy/pasted 3 times
4247 tripoint tp = traj.front();
4248 if( !critter_at( tp ) ) {
4249 debugmsg( _( "Nothing at (%d,%d,%d) to knockback!" ), tp.x, tp.y, tp.z );
4250 return;
4251 }
4252 std::size_t force_remaining = traj.size();
4253 if( monster *const targ = critter_at<monster>( tp, true ) ) {
4254 if( stun > 0 ) {
4255 targ->add_effect( effect_stunned, 1_turns * stun );
4256 add_msg( _( "%s was stunned!" ), targ->name() );
4257 }
4258 for( size_t i = 1; i < traj.size(); i++ ) {
4259 if( m.impassable( traj[i].xy() ) || m.obstructed_by_vehicle_rotation( tp, traj[i] ) ) {
4260 targ->setpos( traj[i - 1] );
4261 force_remaining = traj.size() - i;
4262 if( stun != 0 ) {
4263 targ->add_effect( effect_stunned, 1_turns * force_remaining );
4264 add_msg( _( "%s was stunned!" ), targ->name() );
4265 add_msg( _( "%s slammed into an obstacle!" ), targ->name() );
4266 targ->apply_damage( source, bodypart_id( "torso" ), dam_mult * force_remaining );
4267 targ->check_dead_state();
4268 }
4269 m.bash( traj[i], 2 * dam_mult * force_remaining );
4270 break;
4271 } else if( critter_at( traj[i] ) ) {
4272 targ->setpos( traj[i - 1] );
4273 force_remaining = traj.size() - i;
4274 if( stun != 0 ) {
4275 targ->add_effect( effect_stunned, 1_turns * force_remaining );
4276 add_msg( _( "%s was stunned!" ), targ->name() );
4277 }
4278 traj.erase( traj.begin(), traj.begin() + i );
4279 if( critter_at<monster>( traj.front() ) ) {
4280 add_msg( _( "%s collided with something else and sent it flying!" ),
4281 targ->name() );
4282 } else if( npc *const guy = critter_at<npc>( traj.front() ) ) {
4283 if( guy->male ) {
4284 add_msg( _( "%s collided with someone else and sent him flying!" ),
4285 targ->name() );
4286 } else {
4287 add_msg( _( "%s collided with someone else and sent her flying!" ),
4288 targ->name() );
4289 }
4290 } else if( u.pos() == traj.front() ) {
4291 add_msg( m_bad, _( "%s collided with you and sent you flying!" ), targ->name() );
4292 }
4293 knockback( traj, stun, dam_mult, source );
4294 break;
4295 }
4296 targ->setpos( traj[i] );
4297 if( m.has_flag( "LIQUID", targ->pos() ) && targ->can_drown() && !targ->is_dead() ) {
4298 targ->die( source );
4299 if( u.sees( *targ ) ) {
4300 add_msg( _( "The %s drowns!" ), targ->name() );
4301 }
4302 }
4303 if( !m.has_flag( "LIQUID", targ->pos() ) && targ->has_flag( MF_AQUATIC ) &&
4304 !targ->is_dead() ) {
4305 targ->die( source );
4306 if( u.sees( *targ ) ) {
4307 add_msg( _( "The %s flops around and dies!" ), targ->name() );
4308 }
4309 }
4310 tp = traj[i];
4311 }
4312 } else if( npc *const targ = critter_at<npc>( tp ) ) {
4313 if( stun > 0 ) {
4314 targ->add_effect( effect_stunned, 1_turns * stun );
4315 add_msg( _( "%s was stunned!" ), targ->name );
4316 }
4317 for( size_t i = 1; i < traj.size(); i++ ) {
4318 if( m.impassable( traj[i].xy() ) ||
4319 m.obstructed_by_vehicle_rotation( tp, traj[i] ) ) { // oops, we hit a wall!
4320 targ->setpos( traj[i - 1] );
4321 force_remaining = traj.size() - i;
4322 if( stun != 0 ) {
4323 targ->add_effect( effect_stunned, 1_turns * force_remaining );
4324 if( targ->has_effect( effect_stunned ) ) {
4325 add_msg( _( "%s was stunned!" ), targ->name );
4326 }
4327
4328 std::array<bodypart_id, 8> bps = {{
4329 bodypart_id( "head" ),
4330 bodypart_id( "arm_l" ), bodypart_id( "arm_r" ),
4331 bodypart_id( "hand_l" ), bodypart_id( "hand_r" ),
4332 bodypart_id( "torso" ),
4333 bodypart_id( "leg_l" ), bodypart_id( "leg_r" )
4334 }
4335 };
4336 for( const bodypart_id &bp : bps ) {
4337 if( one_in( 2 ) ) {
4338 targ->deal_damage( source, bp, damage_instance( DT_BASH, force_remaining * dam_mult ) );
4339 }
4340 }
4341 targ->check_dead_state();
4342 }
4343 m.bash( traj[i], 2 * dam_mult * force_remaining );
4344 break;
4345 } else if( critter_at( traj[i] ) ) {
4346 targ->setpos( traj[i - 1] );
4347 force_remaining = traj.size() - i;
4348 if( stun != 0 ) {
4349 add_msg( _( "%s was stunned!" ), targ->name );
4350 targ->add_effect( effect_stunned, 1_turns * force_remaining );
4351 }
4352 traj.erase( traj.begin(), traj.begin() + i );
4353 const tripoint &traj_front = traj.front();
4354 if( critter_at<monster>( traj_front ) ) {
4355 add_msg( _( "%s collided with something else and sent it flying!" ),
4356 targ->name );
4357 } else if( npc *const guy = critter_at<npc>( traj_front ) ) {
4358 if( guy->male ) {
4359 add_msg( _( "%s collided with someone else and sent him flying!" ),
4360 targ->name );
4361 } else {
4362 add_msg( _( "%s collided with someone else and sent her flying!" ),
4363 targ->name );
4364 }
4365 } else if( u.posx() == traj_front.x && u.posy() == traj_front.y &&
4367 ( u.footwear_factor() == .5 && one_in( 2 ) ) ) ) ) {
4368 add_msg( _( "%s collided with you, and barely dislodges your tentacles!" ), targ->name );
4369 } else if( u.posx() == traj_front.x && u.posy() == traj_front.y ) {
4370 add_msg( m_bad, _( "%s collided with you and sent you flying!" ), targ->name );
4371 }
4372 knockback( traj, stun, dam_mult, source );
4373 break;
4374 }
4375 targ->setpos( traj[i] );
4376 tp = traj[i];
4377 }
4378 } else if( u.pos() == tp ) {
4379 if( stun > 0 ) {
4380 u.add_effect( effect_stunned, 1_turns * stun );
4381 add_msg( m_bad, vgettext( "You were stunned for %d turn!",
4382 "You were stunned for %d turns!",
4383 stun ),
4384 stun );
4385 }
4386 for( size_t i = 1; i < traj.size(); i++ ) {
4387 if( m.impassable( traj[i] ) ||
4388 m.obstructed_by_vehicle_rotation( tp, traj[i] ) ) { // oops, we hit a wall!
4389 u.setpos( traj[i - 1] );
4390 force_remaining = traj.size() - i;
4391 if( stun != 0 ) {
4392 if( u.has_effect( effect_stunned ) ) {
4393 add_msg( m_bad, vgettext( "You were stunned AGAIN for %d turn!",
4394 "You were stunned AGAIN for %d turns!",
4395 force_remaining ),
4396 force_remaining );
4397 } else {
4398 add_msg( m_bad, vgettext( "You were stunned for %d turn!",
4399 "You were stunned for %d turns!",
4400 force_remaining ),
4401 force_remaining );
4402 }
4403 u.add_effect( effect_stunned, 1_turns * force_remaining );
4404 std::array<bodypart_id, 8> bps = {{
4405 bodypart_id( "head" ),
4406 bodypart_id( "arm_l" ), bodypart_id( "arm_r" ),
4407 bodypart_id( "hand_l" ), bodypart_id( "hand_r" ),
4408 bodypart_id( "torso" ),
4409 bodypart_id( "leg_l" ), bodypart_id( "leg_r" )
4410 }
4411 };
4412 for( const bodypart_id &bp : bps ) {
4413 if( one_in( 2 ) ) {
4414 u.deal_damage( source, bp, damage_instance( DT_BASH, force_remaining * dam_mult ) );
4415 }
4416 }
4418 }
4419 m.bash( traj[i], 2 * dam_mult * force_remaining );
4420 break;
4421 } else if( critter_at( traj[i] ) ) {
4422 u.setpos( traj[i - 1] );
4423 force_remaining = traj.size() - i;
4424 if( stun != 0 ) {
4425 if( u.has_effect( effect_stunned ) ) {
4426 add_msg( m_bad, vgettext( "You were stunned AGAIN for %d turn!",
4427 "You were stunned AGAIN for %d turns!",
4428 force_remaining ),
4429 force_remaining );
4430 } else {
4431 add_msg( m_bad, vgettext( "You were stunned for %d turn!",
4432 "You were stunned for %d turns!",
4433 force_remaining ),
4434 force_remaining );
4435 }
4436 u.add_effect( effect_stunned, 1_turns * force_remaining );
4437 }
4438 traj.erase( traj.begin(), traj.begin() + i );
4439 if( critter_at<monster>( traj.front() ) ) {
4440 add_msg( _( "You collided with something and sent it flying!" ) );
4441 } else if( npc *const guy = critter_at<npc>( traj.front() ) ) {
4442 if( guy->male ) {
4443 add_msg( _( "You collided with someone and sent him flying!" ) );
4444 } else {
4445 add_msg( _( "You collided with someone and sent her flying!" ) );
4446 }
4447 }
4448 knockback( traj, stun, dam_mult, source );
4449 break;
4450 }
4451 if( m.has_flag( "LIQUID", u.pos() ) && force_remaining == 0 ) {
4452 avatar_action::swim( m, u, u.pos() );
4453 } else {
4454 u.setpos( traj[i] );
4455 }
4456
4457 tp = traj[i];
4458 }
4459 }
4460}
double footwear_factor() const
Returns 1 if the player is wearing something on both feet, .5 if on one, and 0 if on neither.
Definition: character.cpp:8845
dealt_damage_instance deal_damage(Creature *source, bodypart_id bp, const damage_instance &d) override
Calls Creature::deal_damage and handles damaged effects (waking up, etc.)
Definition: character.cpp:8373
void add_effect(const effect &eff, bool force=false, bool deferred=false)
Definition: creature.cpp:985
@ DT_BASH
Definition: damage.h:24
static const trait_id trait_LEG_TENT_BRACE("LEG_TENT_BRACE")
static const efftype_id effect_stunned("stunned")
@ MF_AQUATIC
Definition: mtype.h:89
void swim(map &m, avatar &you, const tripoint &p)
Handles swimming by the player.
const char * vgettext(const char *msgid, const char *msgid_plural, size_t n)

References _, Creature::add_effect(), add_msg(), map::bash(), Creature::check_dead_state(), critter_at(), Character::deal_damage(), debugmsg, DT_BASH, effect_stunned, Character::footwear_factor(), Creature::has_effect(), map::has_flag(), Character::has_trait(), map::impassable(), knockback(), m, m_bad, MF_AQUATIC, map::obstructed_by_vehicle_rotation(), one_in(), Character::pos(), Character::posx(), Character::posy(), Character::sees(), Character::setpos(), avatar_action::swim(), trait_LEG_TENT_BRACE, u, vgettext(), tripoint::x, tripoint::y, and tripoint::z.

◆ light_level()

unsigned char game::light_level ( int  zlev) const

Returns coarse number-of-squares of visibility at the current light level.

Used by monster and NPC AI.

Definition at line 3537 of file game.cpp.

3538{
3539 const float light = natural_light_level( zlev );
3540 return LIGHT_RANGE( light );
3541}
float natural_light_level(int zlev) const
Definition: game.cpp:3477
#define LIGHT_RANGE(b)
Definition: lightmap.h:41

References light, LIGHT_RANGE, and natural_light_level().

Referenced by calc_driving_offset(), and update_overmap_seen().

◆ list_active_characters()

std::vector< std::string > game::list_active_characters ( )

Returns a list of currently active character saves.

Definition at line 2744 of file game.cpp.

2745{
2746 std::vector<std::string> saves;
2747 for( auto &worldsave : world_generator->active_world->world_saves ) {
2748 saves.push_back( worldsave.player_name() );
2749 }
2750 return saves;
2751}

References world_generator.

Referenced by cleanup_at_end().

◆ list_items()

game::vmenu_ret game::list_items ( const std::vector< map_item_stack > &  item_list)
private

Definition at line 7231 of file game.cpp.

7232{
7233 std::vector<map_item_stack> ground_items = item_list;
7234 int iInfoHeight = 0;
7235 int iMaxRows = 0;
7236 int width = 0;
7237 int max_name_width = 0;
7238
7239 //find max length of item name and resize window width
7240 for( const map_item_stack &cur_item : ground_items ) {
7241 const int item_len = utf8_width( remove_color_tags( cur_item.example->display_name() ) ) + 15;
7242 if( item_len > max_name_width ) {
7243 max_name_width = item_len;
7244 }
7245 }
7246
7247 tripoint active_pos;
7248 map_item_stack *activeItem = nullptr;
7249
7250 catacurses::window w_items;
7251 catacurses::window w_items_border;
7252 catacurses::window w_item_info;
7253
7254 ui_adaptor ui;
7255 ui.on_screen_resize( [&]( ui_adaptor & ui ) {
7256 iInfoHeight = std::min( 25, TERMY / 2 );
7257 iMaxRows = TERMY - iInfoHeight - 2;
7258
7259 width = clamp( max_name_width, 45, TERMX / 3 );
7260
7261 const int offsetX = TERMX - width;
7262
7263 w_items = catacurses::newwin( TERMY - 2 - iInfoHeight,
7264 width - 2, point( offsetX + 1, 1 ) );
7265 w_items_border = catacurses::newwin( TERMY - iInfoHeight,
7266 width, point( offsetX, 0 ) );
7267 w_item_info = catacurses::newwin( iInfoHeight, width,
7268 point( offsetX, TERMY - iInfoHeight ) );
7269
7270 if( activeItem ) {
7271 centerlistview( active_pos, width );
7272 }
7273
7274 ui.position( point( offsetX, 0 ), point( width, TERMY ) );
7275 } );
7276 ui.mark_resize();
7277
7278 // use previously selected sorting method
7279 bool sort_radius = uistate.list_item_sort != 2;
7280 bool addcategory = !sort_radius;
7281
7282 // reload filter/priority settings on the first invocation, if they were active
7283 if( !uistate.list_item_init ) {
7286 }
7289 }
7292 }
7293 uistate.list_item_init = true;
7294 }
7295
7296 //this stores only those items that match our filter
7297 std::vector<map_item_stack> filtered_items =
7298 !sFilter.empty() ? filter_item_stacks( ground_items, sFilter ) : ground_items;
7299 int highPEnd = list_filter_high_priority( filtered_items, list_item_upvote );
7300 int lowPStart = list_filter_low_priority( filtered_items, highPEnd, list_item_downvote );
7301 int iItemNum = ground_items.size();
7302
7303 const tripoint stored_view_offset = u.view_offset;
7304
7306
7307 int iActive = 0; // Item index that we're looking at
7308 bool refilter = true;
7309 int page_num = 0;
7310 int iCatSortNum = 0;
7311 int iScrollPos = 0;
7312 std::map<int, std::string> mSortCategory;
7313
7314 std::string action;
7315 input_context ctxt( "LIST_ITEMS" );
7316 ctxt.register_action( "UP", to_translation( "Move cursor up" ) );
7317 ctxt.register_action( "DOWN", to_translation( "Move cursor down" ) );
7318 ctxt.register_action( "LEFT", to_translation( "Previous item" ) );
7319 ctxt.register_action( "RIGHT", to_translation( "Next item" ) );
7320 ctxt.register_action( "PAGE_DOWN" );
7321 ctxt.register_action( "PAGE_UP" );
7322 ctxt.register_action( "NEXT_TAB" );
7323 ctxt.register_action( "PREV_TAB" );
7324 ctxt.register_action( "HELP_KEYBINDINGS" );
7325 ctxt.register_action( "QUIT" );
7326 ctxt.register_action( "FILTER" );
7327 ctxt.register_action( "RESET_FILTER" );
7328 ctxt.register_action( "EXAMINE" );
7329 ctxt.register_action( "COMPARE" );
7330 ctxt.register_action( "PRIORITY_INCREASE" );
7331 ctxt.register_action( "PRIORITY_DECREASE" );
7332 ctxt.register_action( "SORT" );
7333 ctxt.register_action( "TRAVEL_TO" );
7334
7336
7337 ui.on_redraw( [&]( const ui_adaptor & ) {
7338 reset_item_list_state( w_items_border, iInfoHeight, sort_radius );
7339
7340 if( ground_items.empty() ) {
7341 wnoutrefresh( w_items_border );
7342 mvwprintz( w_items, point( 2, 10 ), c_white, _( "You don't see any items around you!" ) );
7343 } else {
7344 int iStartPos = 0;
7345 werase( w_items );
7346 calcStartPos( iStartPos, iActive, iMaxRows, iItemNum );
7347 int iNum = 0;
7348 bool high = false;
7349 bool low = false;
7350 int index = 0;
7351 int iCatSortOffset = 0;
7352
7353 for( int i = 0; i < iStartPos; i++ ) {
7354 if( !mSortCategory[i].empty() ) {
7355 iNum++;
7356 }
7357 }
7358 for( auto iter = filtered_items.begin(); iter != filtered_items.end(); ++index ) {
7359 if( highPEnd > 0 && index < highPEnd + iCatSortOffset ) {
7360 high = true;
7361 low = false;
7362 } else if( index >= lowPStart + iCatSortOffset ) {
7363 high = false;
7364 low = true;
7365 } else {
7366 high = false;
7367 low = false;
7368 }
7369
7370 if( iNum >= iStartPos && iNum < iStartPos + ( iMaxRows > iItemNum ? iItemNum : iMaxRows ) ) {
7371 int iThisPage = 0;
7372 if( !mSortCategory[iNum].empty() ) {
7373 iCatSortOffset++;
7374 mvwprintz( w_items, point( 1, iNum - iStartPos ), c_magenta, mSortCategory[iNum] );
7375 } else {
7376 if( iNum == iActive ) {
7377 iThisPage = page_num;
7378 }
7379 std::string sText;
7380 if( iter->vIG.size() > 1 ) {
7381 sText += string_format( "[%d/%d] (%d) ", iThisPage + 1, iter->vIG.size(), iter->totalcount );
7382 }
7383 sText += iter->example->tname();
7384 if( iter->vIG[iThisPage].count > 1 ) {
7385 sText += string_format( "[%d]", iter->vIG[iThisPage].count );
7386 }
7387
7388 nc_color col = c_light_green;
7389 if( iNum != iActive ) {
7390 if( high ) {
7391 col = c_yellow;
7392 } else if( low ) {
7393 col = c_red;
7394 } else {
7395 col = iter->example->color_in_inventory();
7396 }
7397 }
7398 trim_and_print( w_items, point( 1, iNum - iStartPos ), width - 9, col, sText );
7399 const int numw = iItemNum > 9 ? 2 : 1;
7400 const int x = iter->vIG[iThisPage].pos.x;
7401 const int y = iter->vIG[iThisPage].pos.y;
7402 mvwprintz( w_items, point( width - 6 - numw, iNum - iStartPos ),
7403 iNum == iActive ? c_light_green : c_light_gray,
7404 "%*d %s", numw, rl_dist( point_zero, point( x, y ) ),
7406 ++iter;
7407 }
7408 } else {
7409 ++iter;
7410 }
7411 iNum++;
7412 }
7413 iNum = 0;
7414 for( int i = 0; i < iActive; i++ ) {
7415 if( !mSortCategory[i].empty() ) {
7416 iNum++;
7417 }
7418 }
7419 mvwprintz( w_items_border, point( ( width - 9 ) / 2 + ( iItemNum > 9 ? 0 : 1 ), 0 ),
7420 c_light_green, " %*d", iItemNum > 9 ? 2 : 1, iItemNum > 0 ? iActive - iNum + 1 : 0 );
7421 wprintz( w_items_border, c_white, " / %*d ", iItemNum > 9 ? 2 : 1, iItemNum - iCatSortNum );
7422 werase( w_item_info );
7423
7424 if( iItemNum > 0 && activeItem ) {
7425 std::vector<iteminfo> vThisItem;
7426 std::vector<iteminfo> vDummy;
7427 activeItem->example->info( true, vThisItem );
7428
7429 item_info_data dummy( "", "", vThisItem, vDummy, iScrollPos );
7430 dummy.without_getch = true;
7431 dummy.without_border = true;
7432
7433 draw_item_info( w_item_info, dummy );
7434 }
7435 draw_scrollbar( w_items_border, iActive, iMaxRows, iItemNum, point_south );
7436 wnoutrefresh( w_items_border );
7437 }
7438
7439 const bool bDrawLeft = ground_items.empty() || filtered_items.empty() || !activeItem || filter_type;
7440 draw_custom_border( w_item_info, bDrawLeft, true, true, true, LINE_XXXO, LINE_XOXX, true, true );
7441
7442 if( iItemNum > 0 && activeItem ) {
7443 // print info window title: < item name >
7444 mvwprintw( w_item_info, point( 2, 0 ), "< " );
7445 trim_and_print( w_item_info, point( 4, 0 ), width - 8, activeItem->example->color_in_inventory(),
7446 activeItem->example->display_name() );
7447 wprintw( w_item_info, " >" );
7448 }
7449
7450 wnoutrefresh( w_items );
7451 wnoutrefresh( w_item_info );
7452
7453 if( filter_type ) {
7454 draw_item_filter_rules( w_item_info, 0, iInfoHeight - 1, filter_type.value() );
7455 }
7456 } );
7457
7458 cata::optional<tripoint> trail_start;
7459 cata::optional<tripoint> trail_end;
7460 bool trail_end_x = false;
7461 shared_ptr_fast<draw_callback_t> trail_cb = create_trail_callback( trail_start, trail_end,
7462 trail_end_x );
7463 add_draw_callback( trail_cb );
7464
7465 do {
7466 if( action == "COMPARE" && activeItem ) {
7467 game_menus::inv::compare( u, active_pos );
7468 } else if( action == "FILTER" ) {
7469 filter_type = item_filter_type::FILTER;
7470 ui.invalidate_ui();
7472 .title( _( "Filter:" ) )
7473 .width( 55 )
7474 .description( _( "UP: history, CTRL-U: clear line, ESC: abort, ENTER: save" ) )
7475 .identifier( "item_filter" )
7476 .max_length( 256 )
7477 .edit( sFilter );
7478 refilter = true;
7479 addcategory = !sort_radius;
7481 filter_type = cata::nullopt;
7482 } else if( action == "RESET_FILTER" ) {
7483 sFilter.clear();
7484 filtered_items = ground_items;
7485 refilter = true;
7487 addcategory = !sort_radius;
7488 } else if( action == "EXAMINE" && !filtered_items.empty() && activeItem ) {
7489 std::vector<iteminfo> vThisItem;
7490 std::vector<iteminfo> vDummy;
7491 activeItem->example->info( true, vThisItem );
7492
7493 item_info_data info_data( activeItem->example->tname(), activeItem->example->type_name(), vThisItem,
7494 vDummy );
7495 info_data.handle_scrolling = true;
7496
7498 return catacurses::newwin( TERMY, width - 5, point_zero );
7499 }, info_data );
7500 } else if( action == "PRIORITY_INCREASE" ) {
7501 filter_type = item_filter_type::HIGH_PRIORITY;
7502 ui.invalidate_ui();
7504 .title( _( "High Priority:" ) )
7505 .width( 55 )
7507 .description( _( "UP: history, CTRL-U clear line, ESC: abort, ENTER: save" ) )
7508 .identifier( "list_item_priority" )
7509 .max_length( 256 )
7510 .query_string();
7511 refilter = true;
7512 addcategory = !sort_radius;
7514 filter_type = cata::nullopt;
7515 } else if( action == "PRIORITY_DECREASE" ) {
7516 filter_type = item_filter_type::LOW_PRIORITY;
7517 ui.invalidate_ui();
7519 .title( _( "Low Priority:" ) )
7520 .width( 55 )
7522 .description( _( "UP: history, CTRL-U clear line, ESC: abort, ENTER: save" ) )
7523 .identifier( "list_item_downvote" )
7524 .max_length( 256 )
7525 .query_string();
7526 refilter = true;
7527 addcategory = !sort_radius;
7529 filter_type = cata::nullopt;
7530 } else if( action == "SORT" ) {
7531 if( sort_radius ) {
7532 sort_radius = false;
7533 addcategory = true;
7534 uistate.list_item_sort = 2; // list is sorted by category
7535 } else {
7536 sort_radius = true;
7537 uistate.list_item_sort = 1; // list is sorted by distance
7538 }
7539 highPEnd = -1;
7540 lowPStart = -1;
7541 iCatSortNum = 0;
7542
7543 mSortCategory.clear();
7544 refilter = true;
7545 } else if( action == "TRAVEL_TO" && activeItem ) {
7546 if( !u.sees( u.pos() + active_pos ) ) {
7547 add_msg( _( "You can't see that destination." ) );
7548 }
7549 auto route = m.route( u.pos(), u.pos() + active_pos, u.get_pathfinding_settings(),
7550 u.get_path_avoid() );
7551 if( route.size() > 1 ) {
7552 route.pop_back();
7553 u.set_destination( route );
7554 break;
7555 } else {
7556 add_msg( m_info, _( "You can't travel there." ) );
7557 }
7558 }
7559 if( uistate.list_item_sort == 1 ) {
7560 ground_items = item_list;
7561 } else if( uistate.list_item_sort == 2 ) {
7562 std::sort( ground_items.begin(), ground_items.end(), map_item_stack::map_item_stack_sort );
7563 }
7564
7565 if( refilter ) {
7566 refilter = false;
7567 filtered_items = filter_item_stacks( ground_items, sFilter );
7568 highPEnd = list_filter_high_priority( filtered_items, list_item_upvote );
7569 lowPStart = list_filter_low_priority( filtered_items, highPEnd, list_item_downvote );
7570 iActive = 0;
7571 page_num = 0;
7572 iItemNum = filtered_items.size();
7573 }
7574
7575 if( addcategory ) {
7576 addcategory = false;
7577 iCatSortNum = 0;
7578 mSortCategory.clear();
7579 if( highPEnd > 0 ) {
7580 mSortCategory[0] = _( "HIGH PRIORITY" );
7581 iCatSortNum++;
7582 }
7583 std::string last_cat_name;
7584 for( int i = std::max( 0, highPEnd );
7585 i < std::min( lowPStart, static_cast<int>( filtered_items.size() ) ); i++ ) {
7586 const std::string &cat_name = filtered_items[i].example->get_category().name();
7587 if( cat_name != last_cat_name ) {
7588 mSortCategory[i + iCatSortNum++] = cat_name;
7589 last_cat_name = cat_name;
7590 }
7591 }
7592 if( lowPStart < static_cast<int>( filtered_items.size() ) ) {
7593 mSortCategory[lowPStart + iCatSortNum++] = _( "LOW PRIORITY" );
7594 }
7595 if( !mSortCategory[0].empty() ) {
7596 iActive++;
7597 }
7598 iItemNum = static_cast<int>( filtered_items.size() ) + iCatSortNum;
7599 }
7600
7601 if( action == "UP" ) {
7602 do {
7603 iActive--;
7604
7605 } while( !mSortCategory[iActive].empty() );
7606 iScrollPos = 0;
7607 page_num = 0;
7608 if( iActive < 0 ) {
7609 iActive = iItemNum - 1;
7610 }
7611 } else if( action == "DOWN" ) {
7612 do {
7613 iActive++;
7614
7615 } while( !mSortCategory[iActive].empty() );
7616 iScrollPos = 0;
7617 page_num = 0;
7618 if( iActive >= iItemNum ) {
7619 iActive = mSortCategory[0].empty() ? 0 : 1;
7620 }
7621 } else if( action == "RIGHT" ) {
7622 if( !filtered_items.empty() && activeItem ) {
7623 if( ++page_num >= static_cast<int>( activeItem->vIG.size() ) ) {
7624 page_num = activeItem->vIG.size() - 1;
7625 }
7626 }
7627 } else if( action == "LEFT" ) {
7628 page_num = std::max( 0, page_num - 1 );
7629 } else if( action == "PAGE_UP" ) {
7630 iScrollPos--;
7631 } else if( action == "PAGE_DOWN" ) {
7632 iScrollPos++;
7633 } else if( action == "NEXT_TAB" || action == "PREV_TAB" ) {
7634 u.view_offset = stored_view_offset;
7636 }
7637
7638 active_pos = tripoint_zero;
7639 activeItem = nullptr;
7640
7641 if( mSortCategory[iActive].empty() ) {
7642 auto iter = filtered_items.begin();
7643 for( int iNum = 0; iter != filtered_items.end() && iNum < iActive; iNum++ ) {
7644 if( mSortCategory[iNum].empty() ) {
7645 ++iter;
7646 }
7647 }
7648 if( iter != filtered_items.end() ) {
7649 active_pos = iter->vIG[page_num].pos;
7650 activeItem = &( *iter );
7651 }
7652 }
7653
7654 if( activeItem ) {
7655 centerlistview( active_pos, width );
7656 trail_start = u.pos();
7657 trail_end = u.pos() + active_pos;
7658 // Actually accessed from the terrain overlay callback `trail_cb` in the
7659 // call to `ui_manager::redraw`.
7660 //NOLINTNEXTLINE(clang-analyzer-deadcode.DeadStores)
7661 trail_end_x = true;
7662 } else {
7663 u.view_offset = stored_view_offset;
7664 trail_start = trail_end = cata::nullopt;
7665 }
7667
7669
7670 action = ctxt.handle_input();
7671 } while( action != "QUIT" );
7672
7673 u.view_offset = stored_view_offset;
7674 return game::vmenu_ret::QUIT;
7675}
constexpr T clamp(const T &val, const T &min, const T &max)
Clamp first argument so that it is no lower than second and no higher than third.
Definition: cata_utility.h:145
std::string list_item_upvote
Definition: game.h:1031
std::string list_item_downvote
Definition: game.h:1032
std::string sFilter
Definition: game.h:1030
void reset_item_list_state(const catacurses::window &window, int height, bool bRadiusSort)
Definition: game.cpp:7117
std::string info(bool showtext=false) const
Return all the information about the item and its type.
Definition: item.cpp:1109
nc_color color_in_inventory() const
Returns the color of the item depending on usefulness for the player character, e....
Definition: item.cpp:4053
std::string type_name(unsigned int quantity=1) const
Name of the item type (not the item), with proper plural.
Definition: item.cpp:9723
static bool map_item_stack_sort(const map_item_stack &lhs, const map_item_stack &rhs)
std::vector< item_group > vIG
const item * example
string_input_popup & identifier(const std::string &value)
An identifier to be used to store / get the input history.
string_input_popup & text(const std::string &value)
Set / get the text that can be modified by the user.
void edit(std::string &value)
Edit values in place.
string_input_popup & width(int value)
Width (in console cells) of the input field itself.
string_input_popup & description(const std::string &value)
Additional help text, shown below the input box.
string_input_popup & title(const std::string &value)
The title: short string before the actual input field.
std::string list_item_priority
Definition: uistate.h:120
int list_item_sort
Definition: uistate.h:117
bool list_item_downvote_active
Definition: uistate.h:123
bool list_item_init
Definition: uistate.h:125
bool list_item_filter_active
Definition: uistate.h:122
std::string list_item_filter
Definition: uistate.h:118
bool list_item_priority_active
Definition: uistate.h:124
std::string list_item_downvote
Definition: uistate.h:119
direction direction_from(const coords::coord_point< Point, Origin, Scale > &loc1, const coords::coord_point< Point, Origin, Scale > &loc2)
Definition: coordinates.h:540
static shared_ptr_fast< game::draw_callback_t > create_trail_callback(const cata::optional< tripoint > &trail_start, const cata::optional< tripoint > &trail_end, const bool &trail_end_x)
Definition: game.cpp:3057
uistatedata uistate
Definition: game.cpp:280
static void centerlistview(const tripoint &active_item_position, int ui_width)
Definition: game.cpp:6962
std::string direction_name_short(const direction dir)
Definition: line.cpp:533
int list_filter_high_priority(std::vector< map_item_stack > &stack, const std::string &priorities)
std::vector< map_item_stack > filter_item_stacks(const std::vector< map_item_stack > &stack, const std::string &filter)
int list_filter_low_priority(std::vector< map_item_stack > &stack, const int start, const std::string &priorities)
void mvwprintw(const window &win, const point &p, const std::string &text)
void wprintw(const window &win, const std::string &text)
void calcStartPos(int &iStartPos, const int iCurrentLine, const int iContentHeight, const int iNumEntries)
Definition: output.cpp:1507
void draw_item_filter_rules(const catacurses::window &win, int starty, int height, item_filter_type type)
Write some tips (such as precede items with - to exclude them) onto the window.
Definition: output.cpp:810
void draw_scrollbar(const catacurses::window &window, const int iCurrentLine, const int iContentHeight, const int iNumLines, const point &offset, nc_color bar_color, const bool bDoNotScrollToEnd)
Draw a scrollbar (Legacy function, use class scrollbar instead!)
Definition: output.cpp:1314
std::string remove_color_tags(const std::string &s)
Removes the color tags from the input string.
Definition: output.cpp:145
void draw_custom_border(const catacurses::window &w, const catacurses::chtype ls, const catacurses::chtype rs, const catacurses::chtype ts, const catacurses::chtype bs, const catacurses::chtype tl, const catacurses::chtype tr, const catacurses::chtype bl, const catacurses::chtype br, const nc_color FG, const point &pos, int height, int width)
Definition: output.cpp:524
void trim_and_print(const catacurses::window &w, const point &begin, const int width, const nc_color &base_color, const std::string &text, const report_color_error color_error)
Prints a single line of text.
Definition: output.cpp:214
input_event draw_item_info(const int iLeft, const int iWidth, const int iTop, const int iHeight, item_info_data &data)
Definition: output.cpp:793
#define LINE_XOXX
Definition: output.h:47
#define LINE_XXXO
Definition: output.h:45

References _, action, add_draw_callback(), add_msg(), c_light_gray, c_light_green, c_magenta, c_red, c_white, c_yellow, calcStartPos(), centerlistview(), CHANGE_TAB, clamp(), item::color_in_inventory(), game_menus::inv::compare(), create_trail_callback(), string_input_popup::description(), direction_from(), direction_name_short(), item::display_name(), draw_custom_border(), draw_item_filter_rules(), draw_item_info(), draw_scrollbar(), string_input_popup::edit(), map_item_stack::example, FILTER, filter_item_stacks(), Character::get_path_avoid(), Character::get_pathfinding_settings(), input_context::handle_input(), item_info_data::handle_scrolling, high, HIGH_PRIORITY, string_input_popup::identifier(), item::info(), invalidate_main_ui_adaptor(), LINE_XOXX, LINE_XXXO, list_filter_high_priority(), list_filter_low_priority(), list_item_downvote, uistatedata::list_item_downvote, uistatedata::list_item_downvote_active, uistatedata::list_item_filter, uistatedata::list_item_filter_active, uistatedata::list_item_init, uistatedata::list_item_priority, uistatedata::list_item_priority_active, uistatedata::list_item_sort, list_item_upvote, LOW_PRIORITY, m, m_info, map_item_stack::map_item_stack_sort(), string_input_popup::max_length(), catacurses::mvwprintw(), mvwprintz(), catacurses::newwin(), cata::nullopt, point_south, point_zero, Character::pos(), string_input_popup::query_string(), QUIT, ui_manager::redraw(), input_context::register_action(), remove_color_tags(), reset_item_list_state(), rl_dist(), map::route(), Character::sees(), Character::set_destination(), sFilter, string_format(), TERMX, TERMY, string_input_popup::text(), string_input_popup::title(), item::tname(), to_translation(), trim_and_print(), tripoint_zero, item::type_name(), u, uistate, utf8_width(), cata::optional< T >::value(), player::view_offset, map_item_stack::vIG, catacurses::werase(), string_input_popup::width(), item_info_data::without_border, item_info_data::without_getch, catacurses::wnoutrefresh(), catacurses::wprintw(), and wprintz().

Referenced by list_items_monsters().

◆ list_items_monsters()

void game::list_items_monsters ( )
private

Definition at line 7186 of file game.cpp.

7187{
7188 std::vector<Creature *> mons = u.get_visible_creatures( current_daylight_level( calendar::turn ) );
7189 // whole reality bubble
7190 const std::vector<map_item_stack> items = find_nearby_items( 60 );
7191
7192 if( mons.empty() && items.empty() ) {
7193 add_msg( m_info, _( "You don't see any items or monsters around you!" ) );
7194 return;
7195 }
7196
7197 std::sort( mons.begin(), mons.end(), [&]( const Creature * lhs, const Creature * rhs ) {
7198 const auto att_lhs = lhs->attitude_to( u );
7199 const auto att_rhs = rhs->attitude_to( u );
7200
7201 return att_lhs < att_rhs || ( att_lhs == att_rhs
7202 && rl_dist( u.pos(), lhs->pos() ) < rl_dist( u.pos(), rhs->pos() ) );
7203 } );
7204
7205 // If the current list is empty, switch to the non-empty list
7207 if( items.empty() ) {
7208 uistate.vmenu_show_items = false;
7209 }
7210 } else if( mons.empty() ) {
7212 }
7213
7216 while( true ) {
7217 ret = uistate.vmenu_show_items ? list_items( items ) : list_monsters( mons );
7220 } else {
7221 break;
7222 }
7223 }
7224
7225 if( ret == game::vmenu_ret::FIRE ) {
7227 }
7229}
double current_daylight_level(const time_point &p)
Returns the current seasonally-adjusted maximum daylight level.
Definition: calendar.cpp:171
game::vmenu_ret list_monsters(const std::vector< Creature * > &monster_list)
Definition: game.cpp:7677
game::vmenu_ret list_items(const std::vector< map_item_stack > &item_list)
Definition: game.cpp:7231
vmenu_ret
Definition: game.h:769
std::vector< map_item_stack > find_nearby_items(int iRadius)
Definition: game.cpp:6885
void temp_exit_fullscreen()
Definition: game.cpp:449
void reenter_fullscreen()
Definition: game.cpp:459
bool vmenu_show_items
Definition: uistate.h:121

References _, add_msg(), CHANGE_TAB, current_daylight_level(), find_nearby_items(), FIRE, avatar_action::fire_wielded_weapon(), Character::get_visible_creatures(), list_items(), list_monsters(), m_info, reenter_fullscreen(), cata::hash64_detail::ret, temp_exit_fullscreen(), calendar::turn, u, uistate, and uistatedata::vmenu_show_items.

Referenced by handle_action(), and look_around().

◆ list_missions()

void game::list_missions ( )

Definition at line 22 of file mission_ui.cpp.

23{
24 catacurses::window w_missions;
25
26 enum class tab_mode : int {
27 TAB_ACTIVE = 0,
28 TAB_COMPLETED,
29 TAB_FAILED,
30 NUM_TABS,
31 FIRST_TAB = 0,
32 LAST_TAB = NUM_TABS - 1
33 };
34 tab_mode tab = tab_mode::FIRST_TAB;
35 size_t selection = 0;
36 int entries_per_page = 0;
37 input_context ctxt( "MISSIONS" );
38 ctxt.register_cardinal();
39 ctxt.register_action( "CONFIRM" );
40 ctxt.register_action( "QUIT" );
41 ctxt.register_action( "HELP_KEYBINDINGS" );
42
44 ui.on_screen_resize( [&]( ui_adaptor & ui ) {
46
47 // content ranges from y=3 to FULL_SCREEN_HEIGHT - 2
48 entries_per_page = FULL_SCREEN_HEIGHT - 4;
49
50 ui.position_from_window( w_missions );
51 } );
52 ui.mark_resize();
53
54 std::vector<mission *> umissions;
55
56 ui.on_redraw( [&]( const ui_adaptor & ) {
57 werase( w_missions );
58 // entries_per_page * page number
59 const int top_of_page = entries_per_page * ( selection / entries_per_page );
60 const int bottom_of_page =
61 std::min( top_of_page + entries_per_page - 1, static_cast<int>( umissions.size() ) - 1 );
62
63 for( int i = 3; i < FULL_SCREEN_HEIGHT - 1; i++ ) {
64 mvwputch( w_missions, point( 30, i ), BORDER_COLOR, LINE_XOXO );
65 }
66
67 const std::vector<std::pair<tab_mode, std::string>> tabs = {
68 { tab_mode::TAB_ACTIVE, _( "ACTIVE MISSIONS" ) },
69 { tab_mode::TAB_COMPLETED, _( "COMPLETED MISSIONS" ) },
70 { tab_mode::TAB_FAILED, _( "FAILED MISSIONS" ) },
71 };
72 draw_tabs( w_missions, tabs, tab );
73 draw_border_below_tabs( w_missions );
74
75 mvwputch( w_missions, point( 30, 2 ), BORDER_COLOR,
76 tab == tab_mode::TAB_COMPLETED ? ' ' : LINE_OXXX ); // ^|^
77 mvwputch( w_missions, point( 30, FULL_SCREEN_HEIGHT - 1 ), BORDER_COLOR, LINE_XXOX ); // _|_
78
79 draw_scrollbar( w_missions, selection, entries_per_page, umissions.size(), point( 0, 3 ) );
80
81 for( int i = top_of_page; i <= bottom_of_page; i++ ) {
82 const auto miss = umissions[i];
83 const nc_color col = u.get_active_mission() == miss ? c_light_green : c_white;
84 const int y = i - top_of_page + 3;
85 trim_and_print( w_missions, point( 1, y ), 28,
86 static_cast<int>( selection ) == i ? hilite( col ) : col,
87 miss->name() );
88 }
89
90 if( selection < umissions.size() ) {
91 const auto miss = umissions[selection];
92 const nc_color col = u.get_active_mission() == miss ? c_light_green : c_white;
93 std::string for_npc;
94 if( miss->get_npc_id().is_valid() ) {
95 npc *guy = g->find_npc( miss->get_npc_id() );
96 if( guy ) {
97 for_npc = string_format( _( " for %s" ), guy->disp_name() );
98 }
99 }
100
101 int y = 3;
102 y += fold_and_print( w_missions, point( 31, y ), getmaxx( w_missions ) - 33, col,
103 miss->name() + for_npc );
104
105 auto format_tokenized_description = []( const std::string & description,
106 const std::vector<std::pair<int, itype_id>> &rewards ) {
107 std::string formatted_description = description;
108 for( const auto &reward : rewards ) {
109 std::string token = "<reward_count:" + reward.second.str() + ">";
110 formatted_description = replace_all( formatted_description, token,
111 string_format( "%d", reward.first ) );
112 }
113 return formatted_description;
114 };
115
116 y++;
117 if( !miss->get_description().empty() ) {
118 y += fold_and_print( w_missions, point( 31, y ), getmaxx( w_missions ) - 33, c_white,
119 format_tokenized_description( miss->get_description(), miss->get_likely_rewards() ) );
120 }
121 if( miss->has_deadline() ) {
122 const time_point deadline = miss->get_deadline();
123 mvwprintz( w_missions, point( 31, ++y ), c_white, _( "Deadline: %s" ), to_string( deadline ) );
124
125 if( tab != tab_mode::TAB_COMPLETED ) {
126 // There's no point in displaying this for a completed mission.
127 // @ TODO: But displaying when you completed it would be useful.
128 const time_duration remaining = deadline - calendar::turn;
129 std::string remaining_time;
130
131 if( remaining <= 0_turns ) {
132 remaining_time = _( "None!" );
133 } else if( u.has_watch() ) {
134 remaining_time = to_string( remaining );
135 } else {
136 remaining_time = to_string_approx( remaining );
137 }
138
139 mvwprintz( w_missions, point( 31, ++y ), c_white, _( "Time remaining: %s" ), remaining_time );
140 }
141 }
142 if( miss->has_target() ) {
144 // TODO: target does not contain a z-component, targets are assumed to be on z=0
145 mvwprintz( w_missions, point( 31, ++y ), c_white, _( "Target: %s You: %s" ),
146 miss->get_target().to_string(), pos.to_string() );
147 }
148 } else {
149 static const std::map< tab_mode, std::string > nope = {
150 { tab_mode::TAB_ACTIVE, translate_marker( "You have no active missions!" ) },
151 { tab_mode::TAB_COMPLETED, translate_marker( "You haven't completed any missions!" ) },
152 { tab_mode::TAB_FAILED, translate_marker( "You haven't failed any missions!" ) }
153 };
154 mvwprintz( w_missions, point( 31, 4 ), c_light_red, _( nope.at( tab ) ) );
155 }
156
157 wnoutrefresh( w_missions );
158 } );
159
160 while( true ) {
161 umissions.clear();
162 if( tab < tab_mode::FIRST_TAB || tab >= tab_mode::NUM_TABS ) {
163 debugmsg( "The sanity check failed because tab=%d", static_cast<int>( tab ) );
164 tab = tab_mode::FIRST_TAB;
165 }
166 switch( tab ) {
168 umissions = u.get_active_missions();
169 break;
170 case tab_mode::TAB_COMPLETED:
171 umissions = u.get_completed_missions();
172 break;
173 case tab_mode::TAB_FAILED:
174 umissions = u.get_failed_missions();
175 break;
176 default:
177 break;
178 }
179 if( ( !umissions.empty() && selection >= umissions.size() ) ||
180 ( umissions.empty() && selection != 0 ) ) {
181 debugmsg( "Sanity check failed: selection=%d, size=%d", static_cast<int>( selection ),
182 static_cast<int>( umissions.size() ) );
183 selection = 0;
184 }
186 const std::string action = ctxt.handle_input();
187 if( action == "RIGHT" ) {
188 tab = static_cast<tab_mode>( static_cast<int>( tab ) + 1 );
189 if( tab >= tab_mode::NUM_TABS ) {
190 tab = tab_mode::FIRST_TAB;
191 }
192 selection = 0;
193 } else if( action == "LEFT" ) {
194 tab = static_cast<tab_mode>( static_cast<int>( tab ) - 1 );
195 if( tab < tab_mode::FIRST_TAB ) {
196 tab = tab_mode::LAST_TAB;
197 }
198 selection = 0;
199 } else if( action == "DOWN" ) {
200 selection++;
201 if( selection >= umissions.size() ) {
202 selection = 0;
203 }
204 } else if( action == "UP" ) {
205 if( selection == 0 ) {
206 selection = umissions.empty() ? 0 : umissions.size() - 1;
207 } else {
208 selection--;
209 }
210 } else if( action == "CONFIRM" ) {
211 if( tab == tab_mode::TAB_ACTIVE && selection < umissions.size() ) {
212 u.set_active_mission( *umissions[selection] );
213 }
214 break;
215 } else if( action == "QUIT" ) {
216 break;
217 }
218 }
219}
std::string to_string_approx(const time_duration &dur, const bool verbose)
Returns approximate duration.
Definition: calendar.cpp:361
bool has_watch() const
Returns true if the player or their vehicle has a watch.
Definition: character.cpp:851
void set_active_mission(mission &cur_mission)
Set which mission is active.
Definition: avatar.cpp:214
mission * get_active_mission() const
Returns the mission that is currently active.
Definition: avatar.cpp:193
std::vector< mission * > get_completed_missions() const
Definition: avatar.cpp:183
std::vector< mission * > get_active_missions() const
Definition: avatar.cpp:178
std::vector< mission * > get_failed_missions() const
Definition: avatar.cpp:188
A point in the game time.
Definition: calendar.h:431
nc_color hilite(const nc_color &c)
Definition: color.cpp:509
void draw_tabs(const catacurses::window &w, const std::vector< std::string > &tab_texts, size_t current_tab)
Definition: output.cpp:1274
void draw_border_below_tabs(const catacurses::window &w, nc_color border_color)
Definition: output.cpp:587
int fold_and_print(const catacurses::window &w, const point &begin, int width, const nc_color &base_color, const std::string &text, const char split)
Fold and print text in the given window.
Definition: output.cpp:299
#define LINE_XXOX
Definition: output.h:46
#define BORDER_COLOR
Definition: output.h:135
std::string replace_all(std::string input, const std::string &what, const std::string &with)
Replace all occurences of 'what' within 'input' with 'with'.
#define translate_marker(x)
Marks a string literal to be extracted for translation.
Definition: translations.h:30
catacurses::window new_centered_win(int nlines, int ncols)
Definition: ui.cpp:30

References _, action, BORDER_COLOR, c_light_green, c_light_red, c_white, debugmsg, Character::disp_name(), draw_border_below_tabs(), draw_scrollbar(), draw_tabs(), fold_and_print(), FULL_SCREEN_HEIGHT, FULL_SCREEN_WIDTH, g, avatar::get_active_mission(), avatar::get_active_missions(), avatar::get_completed_missions(), avatar::get_failed_missions(), catacurses::getmaxx(), Character::global_omt_location(), input_context::handle_input(), Character::has_watch(), hilite(), LINE_OXXX, LINE_XOXO, LINE_XXOX, mvwprintz(), mvwputch(), new_centered_win(), ui_manager::redraw(), input_context::register_action(), input_context::register_cardinal(), replace_all(), avatar::set_active_mission(), string_format(), anonymous_namespace{bionics_ui.cpp}::TAB_ACTIVE, coords::coord_point< Point, Origin, Scale >::to_string(), to_string(), to_string_approx(), translate_marker, trim_and_print(), calendar::turn, u, catacurses::werase(), and catacurses::wnoutrefresh().

Referenced by handle_action().

◆ list_monsters()

game::vmenu_ret game::list_monsters ( const std::vector< Creature * > &  monster_list)
private

Definition at line 7677 of file game.cpp.

7678{
7679 const int iInfoHeight = 15;
7680 const int width = 45;
7681 int offsetX = 0;
7682 int iMaxRows = 0;
7683
7684 catacurses::window w_monsters;
7685 catacurses::window w_monsters_border;
7686 catacurses::window w_monster_info;
7687 catacurses::window w_monster_info_border;
7688
7689 Creature *cCurMon = nullptr;
7690 tripoint iActivePos;
7691
7692 bool hide_ui = false;
7693
7694 ui_adaptor ui;
7695 ui.on_screen_resize( [&]( ui_adaptor & ui ) {
7696 if( hide_ui ) {
7697 ui.position( point_zero, point_zero );
7698 } else {
7699 offsetX = TERMX - width;
7700 iMaxRows = TERMY - iInfoHeight - 1;
7701
7702 w_monsters = catacurses::newwin( iMaxRows, width - 2, point( offsetX + 1,
7703 1 ) );
7704 w_monsters_border = catacurses::newwin( iMaxRows + 1, width, point( offsetX,
7705 0 ) );
7706 w_monster_info = catacurses::newwin( iInfoHeight - 2, width - 2,
7707 point( offsetX + 1, TERMY - iInfoHeight + 1 ) );
7708 w_monster_info_border = catacurses::newwin( iInfoHeight, width, point( offsetX,
7709 TERMY - iInfoHeight ) );
7710
7711 if( cCurMon ) {
7712 centerlistview( iActivePos, width );
7713 }
7714
7715 ui.position( point( offsetX, 0 ), point( width, TERMY ) );
7716 }
7717 } );
7718 ui.mark_resize();
7719
7720 const int max_gun_range = u.weapon.gun_range( &u );
7721
7722 const tripoint stored_view_offset = u.view_offset;
7724
7725 int iActive = 0; // monster index that we're looking at
7726
7727 std::string action;
7728 input_context ctxt( "LIST_MONSTERS" );
7729 ctxt.register_action( "UP", to_translation( "Move cursor up" ) );
7730 ctxt.register_action( "DOWN", to_translation( "Move cursor down" ) );
7731 ctxt.register_action( "NEXT_TAB" );
7732 ctxt.register_action( "PREV_TAB" );
7733 ctxt.register_action( "SAFEMODE_BLACKLIST_ADD" );
7734 ctxt.register_action( "SAFEMODE_BLACKLIST_REMOVE" );
7735 ctxt.register_action( "QUIT" );
7736 if( bVMonsterLookFire ) {
7737 ctxt.register_action( "look" );
7738 ctxt.register_action( "fire" );
7739 }
7740 ctxt.register_action( "HELP_KEYBINDINGS" );
7741
7742 // first integer is the row the attitude category string is printed in the menu
7743 std::map<int, Creature::Attitude> mSortCategory;
7744
7745 for( int i = 0, last_attitude = -1; i < static_cast<int>( monster_list.size() ); i++ ) {
7746 const auto attitude = monster_list[i]->attitude_to( u );
7747 if( attitude != last_attitude ) {
7748 mSortCategory[i + mSortCategory.size()] = attitude;
7749 last_attitude = attitude;
7750 }
7751 }
7752
7753 ui.on_redraw( [&]( const ui_adaptor & ) {
7754 if( !hide_ui ) {
7755 draw_custom_border( w_monsters_border, true, true, true, true, true, true, LINE_XOXO, LINE_XOXO );
7756 draw_custom_border( w_monster_info_border, true, true, true, true, LINE_XXXO, LINE_XOXX, true,
7757 true );
7758
7759 mvwprintz( w_monsters_border, point( 2, 0 ), c_light_green, "<Tab> " );
7760 wprintz( w_monsters_border, c_white, _( "Monsters" ) );
7761
7762 if( monster_list.empty() ) {
7763 werase( w_monsters );
7764 mvwprintz( w_monsters, point( 2, iMaxRows / 3 ), c_white,
7765 _( "You don't see any monsters around you!" ) );
7766 } else {
7767 werase( w_monsters );
7768
7769 const int iNumMonster = monster_list.size();
7770 const int iMenuSize = monster_list.size() + mSortCategory.size();
7771
7772 const int numw = iNumMonster > 999 ? 4 :
7773 iNumMonster > 99 ? 3 :
7774 iNumMonster > 9 ? 2 : 1;
7775
7776 // given the currently selected monster iActive. get the selected row
7777 int iSelPos = iActive;
7778 for( auto &ia : mSortCategory ) {
7779 int index = ia.first;
7780 if( index <= iSelPos ) {
7781 ++iSelPos;
7782 } else {
7783 break;
7784 }
7785 }
7786 int iStartPos = 0;
7787 // use selected row get the start row
7788 calcStartPos( iStartPos, iSelPos, iMaxRows - 1, iMenuSize );
7789
7790 // get first visible monster and category
7791 int iCurMon = iStartPos;
7792 auto CatSortIter = mSortCategory.cbegin();
7793 while( CatSortIter != mSortCategory.cend() && CatSortIter->first < iStartPos ) {
7794 ++CatSortIter;
7795 --iCurMon;
7796 }
7797
7798 const auto endY = std::min<int>( iMaxRows - 1, iMenuSize );
7799 for( int y = 0; y < endY; ++y ) {
7800 if( CatSortIter != mSortCategory.cend() ) {
7801 const int iCurPos = iStartPos + y;
7802 const int iCatPos = CatSortIter->first;
7803 if( iCurPos == iCatPos ) {
7804 const std::string cat_name = Creature::get_attitude_ui_data(
7805 CatSortIter->second ).first.translated();
7806 mvwprintz( w_monsters, point( 1, y ), c_magenta, cat_name );
7807 ++CatSortIter;
7808 continue;
7809 }
7810 }
7811 // select current monster
7812 const auto critter = monster_list[iCurMon];
7813 const bool selected = iCurMon == iActive;
7814 ++iCurMon;
7815 if( critter->sees( g->u ) ) {
7816 mvwprintz( w_monsters, point( 0, y ), c_yellow, "!" );
7817 }
7818 bool is_npc = false;
7819 const monster *m = dynamic_cast<monster *>( critter );
7820 const npc *p = dynamic_cast<npc *>( critter );
7821 nc_color name_color = critter->basic_symbol_color();
7822
7823 if( selected ) {
7824 name_color = hilite( name_color );
7825 }
7826
7827 if( m != nullptr ) {
7828 trim_and_print( w_monsters, point( 1, y ), width - 26, name_color, m->name() );
7829 } else {
7830 trim_and_print( w_monsters, point( 1, y ), width - 26, name_color, critter->disp_name() );
7831 is_npc = true;
7832 }
7833
7834 if( selected && !get_safemode().empty() ) {
7835 const std::string monName = is_npc ? get_safemode().npc_type_name() : m->name();
7836
7837 std::string sSafemode;
7838 if( get_safemode().has_rule( monName, Creature::A_ANY ) ) {
7839 sSafemode = _( "<R>emove from safemode Blacklist" );
7840 } else {
7841 sSafemode = _( "<A>dd to safemode Blacklist" );
7842 }
7843
7844 shortcut_print( w_monsters, point( 2, getmaxy( w_monsters ) - 1 ),
7845 c_white, c_light_green, sSafemode );
7846 }
7847
7849 std::string sText;
7850
7851 if( m != nullptr ) {
7852 m->get_HP_Bar( color, sText );
7853 } else {
7854 std::tie( sText, color ) =
7855 ::get_hp_bar( critter->get_hp(), critter->get_hp_max(), false );
7856 }
7857 mvwprintz( w_monsters, point( width - 25, y ), color, sText );
7858
7859 if( m != nullptr ) {
7860 const auto att = m->get_attitude();
7861 sText = att.first;
7862 color = att.second;
7863 } else if( p != nullptr ) {
7864 sText = npc_attitude_name( p->get_attitude() );
7865 color = p->symbol_color();
7866 }
7867 mvwprintz( w_monsters, point( width - 19, y ), color, sText );
7868
7869 const int mon_dist = rl_dist( u.pos(), critter->pos() );
7870 const int numd = mon_dist > 999 ? 4 :
7871 mon_dist > 99 ? 3 :
7872 mon_dist > 9 ? 2 : 1;
7873
7874 trim_and_print( w_monsters, point( width - ( 8 + numd ), y ), 6 + numd,
7875 selected ? c_light_green : c_light_gray,
7876 "%*d %s",
7877 numd, mon_dist,
7878 direction_name_short( direction_from( u.pos(), critter->pos() ) ) );
7879 }
7880
7881 mvwprintz( w_monsters_border, point( ( width / 2 ) - numw - 2, 0 ), c_light_green, " %*d", numw,
7882 iActive + 1 );
7883 wprintz( w_monsters_border, c_white, " / %*d ", numw, static_cast<int>( monster_list.size() ) );
7884
7885 werase( w_monster_info );
7886 if( cCurMon ) {
7887 cCurMon->print_info( w_monster_info, 1, iInfoHeight - 3, 1 );
7888 }
7889
7890 draw_custom_border( w_monster_info_border, true, true, true, true, LINE_XXXO, LINE_XOXX, true,
7891 true );
7892
7893 if( bVMonsterLookFire ) {
7894 mvwprintw( w_monster_info_border, point_east, "< " );
7895 wprintz( w_monster_info_border, c_light_green, ctxt.press_x( "look" ) );
7896 wprintz( w_monster_info_border, c_light_gray, " %s", _( "to look around" ) );
7897
7898 if( cCurMon && rl_dist( u.pos(), cCurMon->pos() ) <= max_gun_range ) {
7899 wprintw( w_monster_info_border, " " );
7900 wprintz( w_monster_info_border, c_light_green, ctxt.press_x( "fire" ) );
7901 wprintz( w_monster_info_border, c_light_gray, " %s", _( "to shoot" ) );
7902 }
7903 wprintw( w_monster_info_border, " >" );
7904 }
7905
7906 draw_scrollbar( w_monsters_border, iActive, iMaxRows, static_cast<int>( monster_list.size() ),
7907 point_south );
7908 }
7909
7910 wnoutrefresh( w_monsters_border );
7911 wnoutrefresh( w_monster_info_border );
7912 wnoutrefresh( w_monsters );
7913 wnoutrefresh( w_monster_info );
7914 }
7915 } );
7916
7917 cata::optional<tripoint> trail_start;
7918 cata::optional<tripoint> trail_end;
7919 bool trail_end_x = false;
7920 shared_ptr_fast<draw_callback_t> trail_cb = create_trail_callback( trail_start, trail_end,
7921 trail_end_x );
7922 add_draw_callback( trail_cb );
7923
7924 do {
7925 if( action == "UP" ) {
7926 iActive--;
7927 if( iActive < 0 ) {
7928 if( monster_list.empty() ) {
7929 iActive = 0;
7930 } else {
7931 iActive = static_cast<int>( monster_list.size() ) - 1;
7932 }
7933 }
7934 } else if( action == "DOWN" ) {
7935 iActive++;
7936 if( iActive >= static_cast<int>( monster_list.size() ) ) {
7937 iActive = 0;
7938 }
7939 } else if( action == "NEXT_TAB" || action == "PREV_TAB" ) {
7940 u.view_offset = stored_view_offset;
7942 } else if( action == "SAFEMODE_BLACKLIST_REMOVE" ) {
7943 const auto m = dynamic_cast<monster *>( cCurMon );
7944 const std::string monName = ( m != nullptr ) ? m->name() : "human";
7945
7946 if( get_safemode().has_rule( monName, Creature::A_ANY ) ) {
7948 }
7949 } else if( action == "SAFEMODE_BLACKLIST_ADD" ) {
7950 if( !get_safemode().empty() ) {
7951 const auto m = dynamic_cast<monster *>( cCurMon );
7952 const std::string monName = ( m != nullptr ) ? m->name() : "human";
7953
7954 get_safemode().add_rule( monName, Creature::A_ANY, get_option<int>( "SAFEMODEPROXIMITY" ),
7956 }
7957 } else if( action == "look" ) {
7958 hide_ui = true;
7959 ui.mark_resize();
7960 look_around();
7961 hide_ui = false;
7962 ui.mark_resize();
7963 } else if( action == "fire" ) {
7964 if( cCurMon != nullptr && rl_dist( u.pos(), cCurMon->pos() ) <= max_gun_range ) {
7965 u.last_target = shared_from( *cCurMon );
7967 u.view_offset = stored_view_offset;
7968 return game::vmenu_ret::FIRE;
7969 }
7970 }
7971
7972 if( iActive >= 0 && static_cast<size_t>( iActive ) < monster_list.size() ) {
7973 cCurMon = monster_list[iActive];
7974 iActivePos = cCurMon->pos() - u.pos();
7975 centerlistview( iActivePos, width );
7976 trail_start = u.pos();
7977 trail_end = cCurMon->pos();
7978 // Actually accessed from the terrain overlay callback `trail_cb` in the
7979 // call to `ui_manager::redraw`.
7980 //NOLINTNEXTLINE(clang-analyzer-deadcode.DeadStores)
7981 trail_end_x = false;
7982 } else {
7983 cCurMon = nullptr;
7984 iActivePos = tripoint_zero;
7985 u.view_offset = stored_view_offset;
7986 trail_start = trail_end = cata::nullopt;
7987 }
7989
7991
7992 action = ctxt.handle_input();
7993 } while( action != "QUIT" );
7994
7995 u.view_offset = stored_view_offset;
7996
7997 return game::vmenu_ret::QUIT;
7998}
double recoil
Definition: character.h:592
nc_color symbol_color() const override
Definition: character.cpp:6021
static const std::pair< translation, nc_color > & get_attitude_ui_data(Attitude att)
Creature Attitude as String and color.
Definition: creature.cpp:1865
virtual const tripoint & pos() const =0
virtual int print_info(const catacurses::window &w, int vStart, int vLines, int column) const =0
Write information about this creature.
shared_ptr_fast< T > shared_from(const T &critter)
Returns a shared pointer to the given critter (which can be of any of the subclasses of Creature).
Definition: game.cpp:4542
bool bVMonsterLookFire
Definition: game.h:1035
int gun_range(const player *p) const
The weapons range in map squares.
Definition: item.cpp:7236
npc_attitude get_attitude() const
Definition: npc.cpp:3139
weak_ptr_fast< Creature > last_target
Definition: player.h:471
bool has_rule(const std::string &rule_in, Creature::Attitude attitude_in)
void remove_rule(const std::string &rule_in, Creature::Attitude attitude_in)
static nc_color color(const T_t &t)
@ RULE_BLACKLISTED
Definition: enums.h:54
constexpr double MAX_RECOIL
std::string npc_attitude_name(npc_attitude att)
Definition: npc.cpp:2545
std::pair< std::string, nc_color > get_hp_bar(const int cur_hp, const int max_hp, const bool is_mon)
Definition: output.cpp:1604
size_t shortcut_print(const catacurses::window &w, const point &p, nc_color text_color, nc_color shortcut_color, const std::string &fmt)
Definition: output.cpp:1543

References _, Creature::A_ANY, action, add_draw_callback(), safemode::add_rule(), bVMonsterLookFire, c_light_gray, c_light_green, c_magenta, c_white, c_yellow, calcStartPos(), centerlistview(), CHANGE_TAB, color(), create_trail_callback(), direction_from(), direction_name_short(), draw_custom_border(), draw_scrollbar(), FIRE, g, npc::get_attitude(), Creature::get_attitude_ui_data(), get_hp_bar(), get_safemode(), catacurses::getmaxy(), item::gun_range(), input_context::handle_input(), safemode::has_rule(), hilite(), invalidate_main_ui_adaptor(), player::last_target, LINE_XOXO, LINE_XOXX, LINE_XXXO, look_around(), m, MAX_RECOIL, catacurses::mvwprintw(), mvwprintz(), map::name(), catacurses::newwin(), npc_attitude_name(), safemode::npc_type_name(), cata::nullopt, point_east, point_south, point_zero, Creature::pos(), Character::pos(), input_context::press_x(), Creature::print_info(), QUIT, Character::recoil, ui_manager::redraw(), input_context::register_action(), safemode::remove_rule(), rl_dist(), RULE_BLACKLISTED, shared_from(), shortcut_print(), Character::symbol_color(), TERMX, TERMY, to_translation(), trim_and_print(), tripoint_zero, u, player::view_offset, Character::weapon, catacurses::werase(), catacurses::wnoutrefresh(), catacurses::wprintw(), and wprintz().

Referenced by list_items_monsters().

◆ load() [1/2]

bool game::load ( const save_t name)
private

Definition at line 2529 of file game.cpp.

2530{
2533 popup.message( "%s", _( "Please wait…\nLoading the save…" ) );
2536
2537 using namespace std::placeholders;
2538
2539 const std::string worldpath = get_world_base_save_path() + "/";
2540 const std::string playerpath = worldpath + name.base_path();
2541
2542 // Now load up the master game data; factions (and more?)
2543 load_master();
2544 u = avatar();
2545 u.name = name.player_name();
2546 // This should be initialized more globally (in player/Character constructor)
2548 if( !read_from_file( playerpath + SAVE_EXTENSION, std::bind( &game::unserialize, this, _1 ) ) ) {
2549 return false;
2550 }
2551
2553 u.get_avatar_diary()->load();
2554
2556
2557 read_from_file_optional( worldpath + name.base_path() + SAVE_EXTENSION_LOG,
2558 std::bind( &memorial_logger::load, &memorial(), _1 ) );
2559
2560#if defined(__ANDROID__)
2561 read_from_file_optional( worldpath + name.base_path() + SAVE_EXTENSION_SHORTCUTS,
2562 std::bind( &game::load_shortcuts, this, _1 ) );
2563#endif
2564
2565 // Now that the player's worn items are updated, their sight limits need to be
2566 // recalculated. (This would be cleaner if u.worn were private.)
2568
2569 if( !gamemode ) {
2570 gamemode = std::make_unique<special_game>();
2571 }
2572
2573 safe_mode = get_option<bool>( "SAFEMODE" ) ? SAFE_MODE_ON : SAFE_MODE_OFF;
2574 mostseen = 0; // ...and mostseen is 0, we haven't seen any monsters yet.
2575
2576 init_autosave();
2577 get_auto_pickup().load_character(); // Load character auto pickup rules
2578 get_auto_notes_settings().load(); // Load character auto notes settings
2579 get_safemode().load_character(); // Load character safemode rules
2580 zone_manager::get_manager().load_zones(); // Load character world zones
2581 read_from_file_optional( get_world_base_save_path() + "/uistate.json", []( std::istream & stream ) {
2582 JsonIn jsin( stream );
2583 uistate.deserialize( jsin );
2584 } );
2585 reload_npcs();
2590 update_map( u );
2591 for( auto &e : u.inv_dump() ) {
2592 e->set_owner( g->u );
2593 }
2594 // legacy, needs to be here as we access the map.
2595 if( !u.getID().is_valid() ) {
2596 // player does not have a real id, so assign a new one,
2597 u.setID( assign_npc_id() );
2598 // The vehicle stores the IDs of the boarded players, so update it, too.
2599 if( u.in_vehicle ) {
2601 u.pos() ).part_with_feature( "BOARDABLE", true ) ) {
2602 vp->part().passenger_id = u.getID();
2603 }
2604 }
2605 }
2606
2607 // populate calendar caches now, after active world is set, but before we do
2608 // anything else, to ensure they pick up the correct value from the save's
2609 // worldoptions
2610 calendar::set_eternal_season( ::get_option<bool>( "ETERNAL_SEASON" ) );
2611 calendar::set_season_length( ::get_option<int>( "SEASON_LENGTH" ) );
2612
2613 u.reset();
2614
2615 return true;
2616}
bool read_from_file(const std::string &path, const std::function< void(std::istream &)> &reader)
Try to open and read from given file using the given callback.
bool read_from_file_optional(const std::string &path, const std::function< void(std::istream &)> &reader)
void setID(character_id i, bool force=false)
Definition: character.cpp:467
std::vector< item * > inv_dump()
Definition: character.cpp:8869
void recalc_sight_limits()
Modifies the player's sight values Must be called when any of the following change: This must be call...
Definition: character.cpp:1744
void reset() override
Handles stat and bonus reset.
Definition: character.cpp:3634
Definition: json.h:177
Definition: avatar.h:55
void load_map_memory()
Definition: avatar.cpp:137
Helper class that fills the background and obscures all UIs below.
Definition: ui_manager.h:193
bool is_valid() const
Definition: character_id.h:19
void load()
Definition: diary.cpp:810
void validate_linked_vehicles()
validate towed vehicles so they get linked up again after a load
Definition: game.cpp:1891
void reload_npcs()
Unloads, then loads the NPCs.
Definition: game.cpp:864
void validate_camps()
validate camps to ensure they are on the overmap list
Definition: game.cpp:1949
void load_master()
Definition: game.cpp:2498
void validate_mounted_npcs()
Definition: game.cpp:1906
character_id assign_npc_id()
Definition: game.cpp:3551
void unserialize(std::istream &fin)
Definition: savegame.cpp:167
void init_autosave()
Definition: game.cpp:11216
void validate_npc_followers()
validate list of followers to account for overmap buffers
Definition: game.cpp:1925
void load(std::istream &fin)
Loads the data in a memorial file from the given ifstream.
void load_character()
Create a popup on the UI stack that gets displayed but receives no input itself.
Definition: popup.h:278
void deserialize(const JsonObject &jo)
time_point nextweather
Definition: weather.h:205
void load_zones()
Definition: clzones.cpp:1216
static const std::string SAVE_EXTENSION(".sav")
static const std::string SAVE_EXTENSION_SHORTCUTS(".shortcuts")
static const std::string SAVE_EXTENSION_LOG(".log")
void set_season_length(int dur)
Definition: calendar.cpp:478
void set_eternal_season(bool is_eternal_season)
Definition: calendar.cpp:470

References _, assign_npc_id(), uistatedata::deserialize(), g, gamemode, get_auto_notes_settings(), get_auto_pickup(), avatar::get_avatar_diary(), zone_manager::get_manager(), get_safemode(), get_weather, get_world_base_save_path(), Character::getID(), Character::in_vehicle, init_autosave(), Character::inv_dump(), character_id::is_valid(), auto_notes::auto_note_settings::load(), diary::load(), memorial_logger::load(), auto_pickup::player_settings::load_character(), safemode::load_character(), avatar::load_map_memory(), load_master(), zone_manager::load_zones(), m, memorial(), mostseen, Character::name, om_direction::name(), weather_manager::nextweather, optional_vpart_position::part_with_feature(), popup(), Character::pos(), read_from_file(), read_from_file_optional(), Character::recalc_sight_limits(), ui_manager::redraw(), refresh_display(), reload_npcs(), Character::reset(), safe_mode, SAFE_MODE_OFF, SAFE_MODE_ON, SAVE_EXTENSION(), SAVE_EXTENSION_LOG(), SAVE_EXTENSION_SHORTCUTS(), calendar::set_eternal_season(), calendar::set_season_length(), Character::setID(), calendar::start_of_cataclysm, calendar::turn, u, uistate, unserialize(), update_map(), validate_camps(), validate_linked_vehicles(), validate_mounted_npcs(), validate_npc_followers(), map::veh_at(), and Character::weapon.

◆ load() [2/2]

bool game::load ( const std::string &  world)

Attempt to load first valid save (if any) in world.

Definition at line 2505 of file game.cpp.

2506{
2507 world_generator->init();
2508 const WORLDPTR wptr = world_generator->get_world( world );
2509 if( !wptr ) {
2510 return false;
2511 }
2512 if( wptr->world_saves.empty() ) {
2513 debugmsg( "world '%s' contains no saves", world );
2514 return false;
2515 }
2516
2517 try {
2518 world_generator->set_active_world( wptr );
2519 g->setup();
2520 g->load( wptr->world_saves.front() );
2521 } catch( const std::exception &err ) {
2522 debugmsg( "cannot load world '%s': %s", world, err.what() );
2523 return false;
2524 }
2525
2526 return true;
2527}
std::vector< save_t > world_saves
Definition: worldfactory.h:61

References debugmsg, g, world_generator, and WORLD::world_saves.

Referenced by quickload().

◆ load_map() [1/2]

void game::load_map ( const tripoint pos_sm,
bool  pump_events = false 
)

Load the main map at given location, see map::load, in global, absolute submap coordinates.

Parameters
pump_eventsIf true, handle window events during loading. If you set this to true, do ensure that the map is not accessed before this function returns (for example, UIs that draw the map should be disabled).

Definition at line 536 of file game.cpp.

537{
538 // TODO: fix point types
539 load_map( tripoint_abs_sm( pos_sm ), pump_events );
540}
void load_map(const tripoint &pos_sm, bool pump_events=false)
Load the main map at given location, see map::load, in global, absolute submap coordinates.
Definition: game.cpp:536
coords::coord_point< tripoint, coords::origin::abs, coords::sm > tripoint_abs_sm
Definition: coordinates.h:490

References load_map().

Referenced by load_map(), place_player_overmap(), start_game(), and unserialize().

◆ load_map() [2/2]

void game::load_map ( const tripoint_abs_sm pos_sm,
bool  pump_events = false 
)

Definition at line 542 of file game.cpp.

544{
545 m.load( pos_sm, true, pump_events );
546 grid_tracker_ptr->load( m );
547}
void load(const tripoint &w, bool update_vehicles, bool pump_events=false)
Load submaps into grid.
Definition: map.cpp:6624

References grid_tracker_ptr, map::load(), and m.

◆ load_master()

void game::load_master ( )
private

Definition at line 2498 of file game.cpp.

2499{
2500 using namespace std::placeholders;
2501 const auto datafile = get_world_base_save_path() + "/" + SAVE_MASTER;
2502 read_from_file_optional( datafile, std::bind( &game::unserialize_master, this, _1 ) );
2503}
void unserialize_master(std::istream &fin)
Definition: savegame.cpp:1193
static const std::string SAVE_MASTER("master.gsav")

References get_world_base_save_path(), read_from_file_optional(), SAVE_MASTER(), and unserialize_master().

Referenced by load(), and start_game().

◆ load_npcs()

void game::load_npcs ( )

Makes any nearby NPCs on the overmap active.

Definition at line 802 of file game.cpp.

803{
804 const int radius = HALF_MAPSIZE - 1;
805 // uses submap coordinates
806 std::vector<shared_ptr_fast<npc>> just_added;
807 for( const auto &temp : overmap_buffer.get_npcs_near_player( radius ) ) {
808 const character_id &id = temp->getID();
809 const auto found = std::find_if( active_npc.begin(), active_npc.end(),
810 [id]( const shared_ptr_fast<npc> &n ) {
811 return n->getID() == id;
812 } );
813 if( found != active_npc.end() ) {
814 continue;
815 }
816 if( temp->is_active() ) {
817 continue;
818 }
819 if( temp->has_companion_mission() ) {
820 continue;
821 }
822
823 const tripoint sm_loc = temp->global_sm_location();
824 // NPCs who are out of bounds before placement would be pushed into bounds
825 // This can cause NPCs to teleport around, so we don't want that
826 if( sm_loc.x < get_levx() || sm_loc.x >= get_levx() + MAPSIZE ||
827 sm_loc.y < get_levy() || sm_loc.y >= get_levy() + MAPSIZE ||
828 ( sm_loc.z != get_levz() && !m.has_zlevels() ) ) {
829 continue;
830 }
831
832 add_msg( m_debug, "game::load_npcs: Spawning static NPC, %d:%d:%d (%d:%d:%d)",
833 get_levx(), get_levy(), get_levz(), sm_loc.x, sm_loc.y, sm_loc.z );
834 temp->place_on_map();
835 if( !m.inbounds( temp->pos() ) ) {
836 continue;
837 }
838 // In the rare case the npc was marked for death while
839 // it was on the overmap. Kill it.
840 if( temp->marked_for_death ) {
841 temp->die( nullptr );
842 } else {
843 active_npc.push_back( temp );
844 just_added.push_back( temp );
845 }
846 }
847
848 for( const auto &npc : just_added ) {
849 npc->on_load();
850 }
851
852 npcs_dirty = false;
853}
void on_load()
Retroactively update npc.
Definition: npc.cpp:2658
static constexpr int MAPSIZE

References active_npc, add_msg(), get_levx(), get_levy(), get_levz(), overmapbuffer::get_npcs_near_player(), HALF_MAPSIZE, map::has_zlevels(), map::inbounds(), m, m_debug, MAPSIZE, npcs_dirty, npc::on_load(), overmap_buffer, tripoint::x, tripoint::y, and tripoint::z.

Referenced by do_turn(), perhaps_add_random_npc(), place_player_overmap(), reload_npcs(), save_cyborg(), spawn_hallucination(), start_game(), and update_map().

◆ load_static_data()

void game::load_static_data ( )

Loads static data that does not depend on mods or similar.

Definition at line 332 of file game.cpp.

333{
334 // UI stuff, not mod-specific per definition
335 inp_mngr.init(); // Load input config JSON
336 // Init mappings for loading the json stuff
338 fullscreen = false;
339 was_fullscreen = false;
340 show_panel_adm = false;
342
343 // These functions do not load stuff from json.
344 // The content they load/initialize is hardcoded into the program.
345 // Therefore they can be loaded here.
346 // If this changes (if they load data from json), they have to
347 // be moved to game::load_mod
348
352}
static DynamicDataLoader & get_instance()
Returns the single instance of this class.
Definition: init.cpp:119
bool was_fullscreen
Definition: game.h:1017
bool fullscreen
Definition: game.h:1016
void init()
Initializes the input manager, aka loads the input mapping configuration JSON.
Definition: input.cpp:111
void init()
Definition: panels.cpp:2191
void load_global()

References fullscreen, get_auto_pickup(), get_distraction_manager(), DynamicDataLoader::get_instance(), panel_manager::get_manager(), get_safemode(), input_manager::init(), panel_manager::init(), inp_mngr, distraction_manager::distraction_manager_gui::load(), auto_pickup::player_settings::load_global(), safemode::load_global(), show_panel_adm, and was_fullscreen.

◆ look_around() [1/2]

cata::optional< tripoint > game::look_around ( bool  force_3d = false)

Definition at line 6533 of file game.cpp.

6534{
6536 look_around_result result = look_around( /*show_window=*/true, center, center, false, false,
6537 false, false, tripoint_zero, force_3d );
6538 return result.position;
6539}

References center, look_around(), Character::pos(), tripoint_zero, u, and player::view_offset.

Referenced by handle_action(), list_monsters(), look_around(), peek(), and zones_manager().

◆ look_around() [2/2]

look_around_result game::look_around ( bool  show_window,
tripoint center,
const tripoint start_point,
bool  has_first_point,
bool  select_zone,
bool  peeking,
bool  is_moving_zone = false,
const tripoint end_point = tripoint_zero,
bool  force_3d = false 
)
Parameters
show_windowdisplay the info window that holds the tile information in the position.
centerused to calculate the u.view_offset, could center the screen to the position it represents
start_pointthe start point of the targeting zone, also the initial local position of the cursor
has_first_pointshould be true if the first point has been selected when editing the zone
select_zonetrue if the zone is being edited
peekingdetermines if the player is peeking
is_moving_zonetrue if the zone is being moved, false by default
end_pointthe end point of the targeting zone, only used if is_moving_zone is true, default is tripoint_zero
Returns
look_around_result

Definition at line 6541 of file game.cpp.

6544{
6545 bVMonsterLookFire = false;
6546 // TODO: Make this `true`
6547 const bool allow_zlev_move = m.has_zlevels() && ( get_option<bool>( "FOV_3D" ) || force_3d );
6548
6550
6551 tripoint lp = is_moving_zone ? ( start_point + end_point ) / 2 : start_point; // cursor
6552 int &lx = lp.x;
6553 int &ly = lp.y;
6554 int &lz = lp.z;
6555
6556 int soffset = get_option<int>( "FAST_SCROLL_OFFSET" );
6557 bool fast_scroll = false;
6558
6559 std::unique_ptr<ui_adaptor> ui;
6560 catacurses::window w_info;
6561 if( show_window ) {
6562 ui = std::make_unique<ui_adaptor>();
6563 ui->on_screen_resize( [&]( ui_adaptor & ui ) {
6564 int panel_width = panel_manager::get_manager().get_current_layout().begin()->get_width();
6566
6567 // If particularly small, base height on panel width irrespective of other elements.
6568 // Value here is attempting to get a square-ish result assuming 1x2 proportioned font.
6569 if( height < panel_width / 2 ) {
6570 height = panel_width / 2;
6571 }
6572
6573 int la_y = 0;
6574 int la_x = TERMX - panel_width;
6575 std::string position = get_option<std::string>( "LOOKAROUND_POSITION" );
6576 if( position == "left" ) {
6577 if( get_option<std::string>( "SIDEBAR_POSITION" ) == "right" ) {
6579 } else {
6580 la_x = panel_manager::get_manager().get_width_left() - panel_width;
6581 }
6582 }
6583 int la_h = height;
6584 int la_w = panel_width;
6585 w_info = catacurses::newwin( la_h, la_w, point( la_x, la_y ) );
6586
6587 ui.position_from_window( w_info );
6588 } );
6589 ui->mark_resize();
6590 }
6591
6592 std::string action;
6593 input_context ctxt( "LOOK" );
6594 ctxt.set_iso( true );
6595 ctxt.register_directions();
6596 ctxt.register_action( "COORDINATE" );
6597 ctxt.register_action( "LEVEL_UP" );
6598 ctxt.register_action( "LEVEL_DOWN" );
6599 ctxt.register_action( "TOGGLE_FAST_SCROLL" );
6600 ctxt.register_action( "EXTENDED_DESCRIPTION" );
6601 ctxt.register_action( "SELECT" );
6602 if( peeking ) {
6603 ctxt.register_action( "throw_blind" );
6604 }
6605 if( !select_zone ) {
6606 ctxt.register_action( "TRAVEL_TO" );
6607 ctxt.register_action( "LIST_ITEMS" );
6608 }
6609 ctxt.register_action( "MOUSE_MOVE" );
6610 ctxt.register_action( "CENTER" );
6611
6612 ctxt.register_action( "debug_scent" );
6613 ctxt.register_action( "debug_scent_type" );
6614 ctxt.register_action( "debug_temp" );
6615 ctxt.register_action( "debug_visibility" );
6616 ctxt.register_action( "debug_lighting" );
6617 ctxt.register_action( "debug_radiation" );
6618 ctxt.register_action( "debug_submap_grid" );
6619 ctxt.register_action( "debug_hour_timer" );
6620 ctxt.register_action( "CONFIRM" );
6621 ctxt.register_action( "QUIT" );
6622 ctxt.register_action( "HELP_KEYBINDINGS" );
6623 if( use_tiles ) {
6624 ctxt.register_action( "zoom_out" );
6625 ctxt.register_action( "zoom_in" );
6626 }
6627#if defined(TILES)
6628 ctxt.register_action( "toggle_pixel_minimap" );
6629#endif // TILES
6630
6631 const int old_levz = get_levz();
6632 const int min_levz = force_3d ? -OVERMAP_DEPTH : std::max( old_levz - fov_3d_z_range,
6633 -OVERMAP_DEPTH );
6634 const int max_levz = force_3d ? OVERMAP_HEIGHT : std::min( old_levz + fov_3d_z_range,
6636
6637 m.update_visibility_cache( old_levz );
6639
6640 bool blink = true;
6642
6643 shared_ptr_fast<draw_callback_t> ter_indicator_cb;
6644
6645 if( show_window && ui ) {
6646 ui->on_redraw( [&]( const ui_adaptor & ) {
6647 werase( w_info );
6648 draw_border( w_info );
6649
6650 center_print( w_info, 0, c_white, string_format( _( "< <color_green>Look Around</color> >" ) ) );
6651
6652 std::string extended_descr_text = string_format( _( "%s - %s" ),
6653 ctxt.get_desc( "EXTENDED_DESCRIPTION" ),
6654 ctxt.get_action_name( "EXTENDED_DESCRIPTION" ) );
6655 std::string fast_scroll_text = string_format( _( "%s - %s" ),
6656 ctxt.get_desc( "TOGGLE_FAST_SCROLL" ),
6657 ctxt.get_action_name( "TOGGLE_FAST_SCROLL" ) );
6658#if defined(TILES)
6659 std::string pixel_minimap_text = string_format( _( "%s - %s" ),
6660 ctxt.get_desc( "toggle_pixel_minimap" ),
6661 ctxt.get_action_name( "toggle_pixel_minimap" ) );
6662#endif // TILES
6663
6664 center_print( w_info, getmaxy( w_info ) - 2, c_light_gray, extended_descr_text );
6665 mvwprintz( w_info, point( 1, getmaxy( w_info ) - 1 ), fast_scroll ? c_light_green : c_green,
6666 fast_scroll_text );
6667#if defined(TILES)
6668 right_print( w_info, getmaxy( w_info ) - 1, 1, pixel_minimap_option ? c_light_green : c_green,
6669 pixel_minimap_text );
6670#endif // TILES
6671
6672 int first_line = 1;
6673 const int last_line = getmaxy( w_info ) - 3;
6674 pre_print_all_tile_info( lp, w_info, first_line, last_line, cache );
6675
6676 wnoutrefresh( w_info );
6677 } );
6678 ter_indicator_cb = make_shared_fast<draw_callback_t>( [&]() {
6679 draw_look_around_cursor( lp, cache );
6680 } );
6681 add_draw_callback( ter_indicator_cb );
6682 }
6683
6684 cata::optional<tripoint> zone_start;
6685 cata::optional<tripoint> zone_end;
6686 bool zone_blink = false;
6687 bool zone_cursor = true;
6688 shared_ptr_fast<draw_callback_t> zone_cb = create_zone_callback( zone_start, zone_end, zone_blink,
6689 zone_cursor, is_moving_zone );
6690 add_draw_callback( zone_cb );
6691
6692 is_looking = true;
6693 const tripoint prev_offset = u.view_offset;
6694#if defined(TILES)
6695 const int prev_tileset_zoom = tileset_zoom;
6696 while( is_moving_zone && square_dist( start_point, end_point ) > 256 / get_zoom() &&
6697 get_zoom() != 4 ) {
6698 zoom_out();
6699 }
6701#endif
6702 do {
6703 u.view_offset = center - u.pos();
6704 if( select_zone ) {
6705 if( has_first_point ) {
6706 zone_start = start_point;
6707 zone_end = lp;
6708 } else {
6709 zone_start = lp;
6710 zone_end = cata::nullopt;
6711 }
6712 // Actually accessed from the terrain overlay callback `zone_cb` in the
6713 // call to `ui_manager::redraw`.
6714 //NOLINTNEXTLINE(clang-analyzer-deadcode.DeadStores)
6715 zone_blink = blink;
6716 }
6717
6718 if( is_moving_zone ) {
6719 zone_start = lp - ( start_point + end_point ) / 2 + start_point;
6720 zone_end = lp - ( start_point + end_point ) / 2 + end_point;
6721 // Actually accessed from the terrain overlay callback `zone_cb` in the
6722 // call to `ui_manager::redraw`.
6723 //NOLINTNEXTLINE(clang-analyzer-deadcode.DeadStores)
6724 zone_blink = blink;
6725 }
6728 if( ( select_zone && has_first_point ) || is_moving_zone ) {
6729 ctxt.set_timeout( get_option<int>( "BLINK_SPEED" ) );
6730 }
6731
6732 //Wait for input
6733 // only specify a timeout here if "EDGE_SCROLL" is enabled
6734 // otherwise use the previously set timeout
6735 const tripoint edge_scroll = mouse_edge_scrolling_terrain( ctxt );
6736 const int scroll_timeout = get_option<int>( "EDGE_SCROLL" );
6737 const bool edge_scrolling = edge_scroll != tripoint_zero && scroll_timeout >= 0;
6738 if( edge_scrolling ) {
6739 action = ctxt.handle_input( scroll_timeout );
6740 } else {
6741 action = ctxt.handle_input();
6742 }
6743 if( ( action == "LEVEL_UP" || action == "LEVEL_DOWN" || action == "MOUSE_MOVE" ||
6744 ctxt.get_direction( action ) ) && ( ( select_zone && has_first_point ) || is_moving_zone ) ) {
6745 blink = true; // Always draw blink symbols when moving cursor
6746 } else if( action == "TIMEOUT" ) {
6747 blink = !blink;
6748 }
6749 if( action == "LIST_ITEMS" ) {
6751 } else if( action == "TOGGLE_FAST_SCROLL" ) {
6752 fast_scroll = !fast_scroll;
6753 } else if( action == "toggle_pixel_minimap" ) {
6755
6756 if( show_window && ui ) {
6757 ui->mark_resize();
6758 }
6759 } else if( action == "LEVEL_UP" || action == "LEVEL_DOWN" ) {
6760 if( !allow_zlev_move ) {
6761 continue;
6762 }
6763
6764 const int dz = ( action == "LEVEL_UP" ? 1 : -1 );
6765 lz = clamp( lz + dz, min_levz, max_levz );
6766 center.z = clamp( center.z + dz, min_levz, max_levz );
6767
6768 add_msg( m_debug, "levx: %d, levy: %d, levz: %d", get_levx(), get_levy(), center.z );
6769 u.view_offset.z = center.z - u.posz();
6771 } else if( action == "TRAVEL_TO" ) {
6772 if( !u.sees( lp ) ) {
6773 add_msg( _( "You can't see that destination." ) );
6774 continue;
6775 }
6776
6777 auto route = m.route( u.pos(), lp, u.get_pathfinding_settings(), u.get_path_avoid() );
6778 if( route.size() > 1 ) {
6779 route.pop_back();
6780 u.set_destination( route );
6781 } else {
6782 add_msg( m_info, _( "You can't travel there." ) );
6783 continue;
6784 }
6785 } else if( action == "debug_scent" || action == "debug_scent_type" ) {
6787 display_scent();
6788 }
6789 } else if( action == "debug_temp" ) {
6792 }
6793 } else if( action == "debug_lighting" ) {
6796 }
6797 } else if( action == "debug_transparency" ) {
6800 }
6801 } else if( action == "debug_radiation" ) {
6804 }
6805 } else if( action == "debug_submap_grid" ) {
6806 g->debug_submap_grid_overlay = !g->debug_submap_grid_overlay;
6807 } else if( action == "debug_hour_timer" ) {
6809 } else if( action == "EXTENDED_DESCRIPTION" ) {
6811 } else if( action == "CENTER" ) {
6812 center = u.pos();
6813 lp = u.pos();
6814 u.view_offset.z = 0;
6815 } else if( action == "MOUSE_MOVE" || action == "TIMEOUT" ) {
6816 // This block is structured this way so that edge scroll can work
6817 // whether the mouse is moving at the edge or simply stationary
6818 // at the edge. But even if edge scroll isn't in play, there's
6819 // other things for us to do here.
6820
6821 if( edge_scrolling ) {
6822 center += action == "MOUSE_MOVE" ? edge_scroll * 2 : edge_scroll;
6823 } else if( action == "MOUSE_MOVE" ) {
6824 const cata::optional<tripoint> mouse_pos = ctxt.get_coordinates( w_terrain );
6825 if( mouse_pos ) {
6826 lx = mouse_pos->x;
6827 ly = mouse_pos->y;
6828 }
6829 }
6830 } else if( cata::optional<tripoint> vec = ctxt.get_direction( action ) ) {
6831 if( fast_scroll ) {
6832 vec->x *= soffset;
6833 vec->y *= soffset;
6834 }
6835
6836 lx = lx + vec->x;
6837 ly = ly + vec->y;
6838 center.x = center.x + vec->x;
6839 center.y = center.y + vec->y;
6840 } else if( action == "throw_blind" ) {
6841 result.peek_action = PA_BLIND_THROW;
6842 } else if( action == "zoom_in" ) {
6843 center.x = lp.x;
6844 center.y = lp.y;
6845 zoom_in();
6847 } else if( action == "zoom_out" ) {
6848 center.x = lp.x;
6849 center.y = lp.y;
6850 zoom_out();
6852 }
6853 } while( action != "QUIT" && action != "CONFIRM" && action != "SELECT" && action != "TRAVEL_TO" &&
6854 action != "throw_blind" );
6855
6856 if( m.has_zlevels() && center.z != old_levz ) {
6857 m.invalidate_map_cache( old_levz );
6858 m.build_map_cache( old_levz );
6859 u.view_offset.z = 0;
6860 }
6861
6862 ctxt.reset_timeout();
6863 u.view_offset = prev_offset;
6864 zone_cb = nullptr;
6865 is_looking = false;
6866
6868 bVMonsterLookFire = true;
6869
6870 if( action == "CONFIRM" || action == "SELECT" ) {
6871 result.position = is_moving_zone ? zone_start : lp;
6872 }
6873
6874#if defined(TILES)
6875 if( is_moving_zone && get_zoom() != prev_tileset_zoom ) {
6876 // Reset the tileset zoom to the previous value
6877 set_zoom( prev_tileset_zoom );
6879 }
6880#endif
6881
6882 return result;
6883}
bool pixel_minimap_option
Whether to show the pixel minimap.
tripoint mouse_edge_scrolling_terrain(input_context &ctxt)
Used to implement mouse "edge scrolling".
Definition: game.cpp:2076
void set_zoom(int level)
Definition: game.cpp:7040
void draw_look_around_cursor(const tripoint &lp, const visibility_variables &cache)
Definition: game.cpp:5644
void extended_description(const tripoint &p)
Long description of (visible) things at tile.
void pre_print_all_tile_info(const tripoint &lp, const catacurses::window &w_info, int &line, int last_line, const visibility_variables &cache)
Definition: game.cpp:6520
int get_zoom() const
Definition: game.cpp:7052
const visibility_variables & get_visibility_variables_cache() const
Definition: map.cpp:5659
void invalidate_map_cache(const int zlev)
Definition: map.h:470
std::vector< window_panel > & get_current_layout()
Definition: panels.cpp:2159
int square_dist(const coords::coord_point< Point, Origin, Scale > &loc1, const coords::coord_point< Point, Origin, Scale > &loc2)
Definition: coordinates.h:505
static shared_ptr_fast< game::draw_callback_t > create_zone_callback(const cata::optional< tripoint > &zone_start, const cata::optional< tripoint > &zone_end, const bool &zone_blink, const bool &zone_cursor, const bool &is_moving_zone=false)
Definition: game.cpp:3010
@ PA_BLIND_THROW
Definition: game.h:122
static constexpr int OVERMAP_HEIGHT
static constexpr int OVERMAP_DEPTH
int right_print(const catacurses::window &w, const int line, const int right_indent, const nc_color &FG, const std::string &text)
Definition: output.cpp:461

References _, action, add_draw_callback(), add_msg(), map::build_map_cache(), bVMonsterLookFire, c_green, c_light_gray, c_light_green, c_white, center, center_print(), clamp(), create_zone_callback(), display_lighting(), display_radiation(), display_scent(), display_temperature(), display_transparency(), draw_border(), draw_look_around_cursor(), extended_description(), fov_3d_z_range, g, input_context::get_action_name(), input_context::get_coordinates(), panel_manager::get_current_layout(), input_context::get_desc(), input_context::get_direction(), get_levx(), get_levy(), get_levz(), panel_manager::get_manager(), Character::get_path_avoid(), Character::get_pathfinding_settings(), map::get_visibility_variables_cache(), panel_manager::get_width_left(), get_zoom(), catacurses::getmaxy(), input_context::handle_input(), map::has_zlevels(), invalidate_main_ui_adaptor(), map::invalidate_map_cache(), is_looking, MAP_SHARING::isCompetitive(), MAP_SHARING::isDebugger(), list_items_monsters(), m, m_debug, m_info, mark_main_ui_adaptor_resize(), mouse_edge_scrolling_terrain(), mvwprintz(), catacurses::newwin(), cata::nullopt, OVERMAP_DEPTH, OVERMAP_HEIGHT, PA_BLIND_THROW, pixel_minimap_option, Character::pos(), Character::posz(), pre_print_all_tile_info(), ui_manager::redraw(), reenter_fullscreen(), input_context::register_action(), input_context::register_directions(), input_context::reset_timeout(), right_print(), map::route(), Character::sees(), Character::set_destination(), input_context::set_iso(), input_context::set_timeout(), set_zoom(), square_dist(), string_format(), temp_exit_fullscreen(), TERMX, TERMY, tileset_zoom, toggle_debug_hour_timer(), toggle_pixel_minimap(), tripoint_zero, u, map::update_visibility_cache(), use_tiles, player::view_offset, w_pixel_minimap, w_terrain, catacurses::werase(), catacurses::wnoutrefresh(), tripoint::x, tripoint::y, tripoint::z, zoom_in(), and zoom_out().

◆ look_debug()

cata::optional< tripoint > game::look_debug ( )

Definition at line 5637 of file game.cpp.

5638{
5639 editmap edit;
5640 return edit.edit();
5641}
cata::optional< tripoint > edit()
Definition: editmap.cpp:340

References editmap::edit().

◆ mark_main_ui_adaptor_resize()

void game::mark_main_ui_adaptor_resize ( ) const

Definition at line 2967 of file game.cpp.

2968{
2970 if( ui ) {
2971 ui->mark_resize();
2972 }
2973}

References main_ui_adaptor.

Referenced by handle_action(), look_around(), toggle_fullscreen(), and toggle_pixel_minimap().

◆ memorial()

memorial_logger & game::memorial ( )

Definition at line 2709 of file game.cpp.

2710{
2711 return *memorial_logger_ptr;
2712}

References memorial_logger_ptr.

Referenced by cleanup_at_end(), load(), save_player_data(), win(), win_screen(), and write_memorial_file().

◆ mon_info()

void game::mon_info ( const catacurses::window w,
int  hor_padding = 0 
)

Definition at line 3658 of file game.cpp.

3659{
3660 const monster_visible_info &mon_visible = u.get_mon_visible();
3661 const auto &unique_types = mon_visible.unique_types;
3662 const auto &unique_mons = mon_visible.unique_mons;
3663 const auto &dangerous = mon_visible.dangerous;
3664
3665 const int width = getmaxx( w ) - 2 * hor_padding;
3666 const int maxheight = getmaxy( w );
3667
3668 const int startrow = 0;
3669
3670 // Print the direction headings
3671 // Reminder:
3672 // 7 0 1 unique_types uses these indices;
3673 // 6 8 2 0-7 are provide by direction_from()
3674 // 5 4 3 8 is used for local monsters (for when we explain them below)
3675
3676 const std::array<std::string, 8> dir_labels = {{
3677 _( "North:" ), _( "NE:" ), _( "East:" ), _( "SE:" ),
3678 _( "South:" ), _( "SW:" ), _( "West:" ), _( "NW:" )
3679 }
3680 };
3681 std::array<int, 8> widths;
3682 for( int i = 0; i < 8; i++ ) {
3683 widths[i] = utf8_width( dir_labels[i] );
3684 }
3685 std::array<int, 8> xcoords;
3686 const std::array<int, 8> ycoords = {{ 0, 0, 1, 2, 2, 2, 1, 0 }};
3687 xcoords[0] = xcoords[4] = width / 3;
3688 xcoords[1] = xcoords[3] = xcoords[2] = ( width / 3 ) * 2;
3689 xcoords[5] = xcoords[6] = xcoords[7] = 0;
3690 //for the alignment of the 1,2,3 rows on the right edge
3691 xcoords[2] -= utf8_width( _( "East:" ) ) - utf8_width( _( "NE:" ) );
3692 for( int i = 0; i < 8; i++ ) {
3693 nc_color c = unique_types[i].empty() && unique_mons[i].empty() ? c_dark_gray
3694 : ( dangerous[i] ? c_light_red : c_light_gray );
3695 mvwprintz( w, point( xcoords[i] + hor_padding, ycoords[i] + startrow ), c, dir_labels[i] );
3696 }
3697
3698 // Print the symbols of all monsters in all directions.
3699 for( int i = 0; i < 8; i++ ) {
3700 point pr( xcoords[i] + widths[i] + 1, ycoords[i] + startrow );
3701
3702 // The list of symbols needs a space on each end.
3703 int symroom = ( width / 3 ) - widths[i] - 2;
3704 const int typeshere_npc = unique_types[i].size();
3705 const int typeshere_mon = unique_mons[i].size();
3706 const int typeshere = typeshere_mon + typeshere_npc;
3707 for( int j = 0; j < typeshere && j < symroom; j++ ) {
3708 nc_color c;
3709 std::string sym;
3710 if( symroom < typeshere && j == symroom - 1 ) {
3711 // We've run out of room!
3712 c = c_white;
3713 sym = "+";
3714 } else if( j < typeshere_npc ) {
3715 switch( unique_types[i][j]->get_attitude() ) {
3716 case NPCATT_KILL:
3717 c = c_red;
3718 break;
3719 case NPCATT_FOLLOW:
3720 c = c_light_green;
3721 break;
3722 default:
3723 c = c_pink;
3724 break;
3725 }
3726 sym = "@";
3727 } else {
3728 const mtype &mt = *unique_mons[i][j - typeshere_npc].first;
3729 c = mt.color;
3730 sym = mt.sym;
3731 }
3732 mvwprintz( w, pr, c, sym );
3733
3734 pr.x++;
3735 }
3736 }
3737
3738 // Now we print their full names!
3739 struct nearest_loc_and_cnt {
3740 int nearest_loc;
3741 int cnt;
3742 };
3743 std::map<const mtype *, nearest_loc_and_cnt> all_mons;
3744 for( int loc = 0; loc < 9; loc++ ) {
3745 for( const std::pair<const mtype *, int> &mon : unique_mons[loc] ) {
3746 const auto mon_it = all_mons.find( mon.first );
3747 if( mon_it == all_mons.end() ) {
3748 all_mons.emplace( mon.first, nearest_loc_and_cnt{ loc, mon.second } );
3749 } else {
3750 // 8 being the nearest location (local monsters)
3751 mon_it->second.nearest_loc = std::max( mon_it->second.nearest_loc, loc );
3752 mon_it->second.cnt += mon.second;
3753 }
3754 }
3755 }
3756 std::vector<std::pair<const mtype *, int>> mons_at[9];
3757 for( const std::pair<const mtype *const, nearest_loc_and_cnt> &mon : all_mons ) {
3758 mons_at[mon.second.nearest_loc].emplace_back( mon.first, mon.second.cnt );
3759 }
3760
3761 // Start printing monster names on row 4. Rows 0-2 are for labels, and row 3
3762 // is blank.
3763 point pr( hor_padding, 4 + startrow );
3764
3765 // Print monster names, starting with those at location 8 (nearby).
3766 for( int j = 8; j >= 0 && pr.y < maxheight; j-- ) {
3767 // Separate names by some number of spaces (more for local monsters).
3768 int namesep = ( j == 8 ? 2 : 1 );
3769 for( const std::pair<const mtype *, int> &mon : mons_at[j] ) {
3770 const mtype *const type = mon.first;
3771 const int count = mon.second;
3772 if( pr.y >= maxheight ) {
3773 // no space to print to anyway
3774 break;
3775 }
3776
3777 const mtype &mt = *type;
3778 std::string name = mt.nname( count );
3779 // Some languages don't have plural forms, but we want to always
3780 // omit 1.
3781 if( count != 1 ) {
3782 name = string_format( pgettext( "monster count and name", "%1$d %2$s" ),
3783 count, name );
3784 }
3785
3786 // Move to the next row if necessary. (The +2 is for the "Z ").
3787 if( pr.x + 2 + utf8_width( name ) >= width ) {
3788 pr.y++;
3789 pr.x = hor_padding;
3790 }
3791
3792 if( pr.y < maxheight ) { // Don't print if we've overflowed
3793 mvwprintz( w, pr, mt.color, mt.sym );
3794 pr.x += 2; // symbol and space
3795 nc_color danger = c_dark_gray;
3796 if( mt.difficulty >= 30 ) {
3797 danger = c_red;
3798 } else if( mt.difficulty >= 16 ) {
3799 danger = c_light_red;
3800 } else if( mt.difficulty >= 8 ) {
3801 danger = c_white;
3802 } else if( mt.agro > 0 ) {
3803 danger = c_light_gray;
3804 }
3805 mvwprintz( w, pr, danger, name );
3806 pr.x += utf8_width( name ) + namesep;
3807 }
3808 }
3809 }
3810}
@ NPCATT_KILL
Definition: npc.h:91
@ NPCATT_FOLLOW
Definition: npc.h:84
std::vector< std::pair< const mtype *, int > > unique_mons[9]
Definition: avatar.h:48
bool dangerous[8]
Definition: avatar.h:51
std::vector< npc * > unique_types[9]
Definition: avatar.h:47
Definition: mtype.h:208
std::string sym
UTF-8 encoded symbol, should be exactly one cell wide.
Definition: mtype.h:256
nc_color color
Definition: mtype.h:261
int difficulty
Definition: mtype.h:267
int agro
e.g.
Definition: mtype.h:272

References _, mtype::agro, c, c_dark_gray, c_light_gray, c_light_green, c_light_red, c_pink, c_red, c_white, mtype::color, detail::count(), monster_visible_info::dangerous, mtype::difficulty, avatar::get_mon_visible(), catacurses::getmaxx(), catacurses::getmaxy(), mvwprintz(), om_direction::name(), mtype::nname(), NPCATT_FOLLOW, NPCATT_KILL, pgettext(), string_format(), mtype::sym, type, u, monster_visible_info::unique_mons, monster_visible_info::unique_types, utf8_width(), point::x, and point::y.

◆ mon_info_update()

void game::mon_info_update ( )

Definition at line 3812 of file game.cpp.

3813{
3814 int newseen = 0;
3815 const int safe_proxy_dist = get_option<int>( "SAFEMODEPROXIMITY" );
3816 const int iProxyDist = ( safe_proxy_dist <= 0 ) ? MAX_VIEW_DISTANCE :
3817 safe_proxy_dist;
3818
3819 monster_visible_info &mon_visible = u.get_mon_visible();
3820 auto &new_seen_mon = mon_visible.new_seen_mon;
3821 auto &unique_types = mon_visible.unique_types;
3822 auto &unique_mons = mon_visible.unique_mons;
3823 auto &dangerous = mon_visible.dangerous;
3824
3825 // 7 0 1 unique_types uses these indices;
3826 // 6 8 2 0-7 are provide by direction_from()
3827 // 5 4 3 8 is used for local monsters (for when we explain them below)
3828 for( auto &t : unique_types ) {
3829 t.clear();
3830 }
3831 for( auto &m : unique_mons ) {
3832 m.clear();
3833 }
3834 std::fill( dangerous, dangerous + 8, false );
3835
3836 const tripoint view = u.pos() + u.view_offset;
3837 new_seen_mon.clear();
3838
3839 // TODO: no reason to have it static here
3840 static time_point previous_turn = calendar::start_of_cataclysm;
3841 const time_duration sm_ignored_time = time_duration::from_turns(
3842 get_option<int>( "SAFEMODEIGNORETURNS" ) );
3843
3845 monster *m = dynamic_cast<monster *>( c );
3846 npc *p = dynamic_cast<npc *>( c );
3847 const direction dir_to_mon = direction_from( view.xy(), point( c->posx(), c->posy() ) );
3848 const int mx = POSX + ( c->posx() - view.x );
3849 const int my = POSY + ( c->posy() - view.y );
3850 int index = 8;
3851 if( !is_valid_in_w_terrain( point( mx, my ) ) ) {
3852 // for compatibility with old code, see diagram below, it explains the values for index,
3853 // also might need revisiting one z-levels are in.
3854 switch( dir_to_mon ) {
3858 index = 7;
3859 break;
3861 case direction::NORTH:
3863 index = 0;
3864 break;
3868 index = 1;
3869 break;
3871 case direction::WEST:
3873 index = 6;
3874 break;
3876 case direction::CENTER:
3878 index = 8;
3879 break;
3881 case direction::EAST:
3883 index = 2;
3884 break;
3888 index = 5;
3889 break;
3891 case direction::SOUTH:
3893 index = 4;
3894 break;
3898 index = 3;
3899 break;
3900 }
3901 }
3902
3903 rule_state safemode_state = RULE_NONE;
3904 const bool safemode_empty = get_safemode().empty();
3905
3906 if( m != nullptr ) {
3907 //Safemode monster check
3908 monster &critter = *m;
3909
3910 const monster_attitude matt = critter.attitude( &u );
3911 const int mon_dist = rl_dist( u.pos(), critter.pos() );
3912 safemode_state = get_safemode().check_monster( critter.name(), critter.attitude_to( u ), mon_dist );
3913
3914 if( ( !safemode_empty && safemode_state == RULE_BLACKLISTED ) || ( safemode_empty &&
3915 ( MATT_ATTACK == matt || MATT_FOLLOW == matt ) ) ) {
3916 if( index < 8 && critter.sees( g->u ) ) {
3917 dangerous[index] = true;
3918 }
3919
3920 if( !safemode_empty || mon_dist <= iProxyDist ) {
3921 bool passmon = false;
3922 if( critter.ignoring > 0 ) {
3923 if( safe_mode != SAFE_MODE_ON ) {
3924 critter.ignoring = 0;
3925 } else if( ( sm_ignored_time == 0_seconds || ( critter.lastseen_turn &&
3926 *critter.lastseen_turn > calendar::turn - sm_ignored_time ) ) &&
3927 ( mon_dist > critter.ignoring / 2 || mon_dist < 6 ) ) {
3928 passmon = true;
3929 }
3930 critter.lastseen_turn = calendar::turn;
3931 }
3932
3933 if( !passmon ) {
3934 newseen++;
3935 new_seen_mon.push_back( shared_from( critter ) );
3936 }
3937 }
3938 }
3939
3940 std::vector<std::pair<const mtype *, int>> &vec = unique_mons[index];
3941 const auto mon_it = std::find_if( vec.begin(), vec.end(),
3942 [&]( const std::pair<const mtype *, int> &elem ) {
3943 return elem.first == critter.type;
3944 } );
3945 if( mon_it == vec.end() ) {
3946 vec.emplace_back( critter.type, 1 );
3947 } else {
3948 mon_it->second++;
3949 }
3950 } else if( p != nullptr ) {
3951 //Safe mode NPC check
3952
3953 const int npc_dist = rl_dist( u.pos(), p->pos() );
3954 safemode_state = get_safemode().check_monster( get_safemode().npc_type_name(), p->attitude_to( u ),
3955 npc_dist );
3956
3957 if( ( !safemode_empty && safemode_state == RULE_BLACKLISTED ) || ( safemode_empty &&
3958 p->get_attitude() == NPCATT_KILL ) ) {
3959 if( !safemode_empty || npc_dist <= iProxyDist ) {
3960 newseen++;
3961 }
3962 }
3963 unique_types[index].push_back( p );
3964 }
3965 }
3966
3967 if( newseen > mostseen ) {
3968 if( newseen - mostseen == 1 ) {
3969 if( !new_seen_mon.empty() ) {
3970 monster &critter = *new_seen_mon.back();
3972 string_format( _( "%s spotted!" ), critter.name() ) );
3973 if( u.has_trait( trait_id( "M_DEFENDER" ) ) && critter.type->in_species( PLANT ) ) {
3974 add_msg( m_warning, _( "We have detected a %s - an enemy of the Mycus!" ), critter.name() );
3976 u.add_effect( effect_adrenaline_mycus, 30_minutes );
3977 } else if( u.get_effect_int( effect_adrenaline_mycus ) == 1 ) {
3978 // Triffids present. We ain't got TIME to adrenaline comedown!
3979 u.add_effect( effect_adrenaline_mycus, 15_minutes );
3980 u.mod_pain( 3 ); // Does take it out of you, though
3981 add_msg( m_info, _( "Our fibers strain with renewed wrath!" ) );
3982 }
3983 }
3984 } else {
3985 //Hostile NPC
3987 _( "Hostile survivor spotted!" ) );
3988 }
3989 } else {
3991 }
3993 if( safe_mode == SAFE_MODE_ON ) {
3995 }
3996 } else if( calendar::turn > previous_turn && get_option<bool>( "AUTOSAFEMODE" ) &&
3997 newseen == 0 ) { // Auto-safe mode, but only if it's a new turn
3998 turnssincelastmon += to_turns<int>( calendar::turn - previous_turn );
3999 if( turnssincelastmon >= get_option<int>( "AUTOSAFEMODETURNS" ) && safe_mode == SAFE_MODE_OFF ) {
4001 add_msg( m_info, _( "Safe mode ON!" ) );
4002 }
4003 }
4004
4005 if( newseen == 0 && safe_mode == SAFE_MODE_STOP ) {
4007 }
4008
4009 previous_turn = calendar::turn;
4010 mostseen = newseen;
4011}
int get_effect_int(const efftype_id &eff_id, body_part bp=num_bp) const
Returns the intensity of the matching effect.
Definition: creature.cpp:1255
virtual bool sees(const Creature &critter) const
The functions check whether this creature can see the target.
Definition: creature.cpp:207
bool cancel_activity_or_ignore_query(distraction_type type, const std::string &text)
Asks if the player wants to cancel their activity and if so cancels it.
Definition: game.cpp:1697
monster_attitude attitude(const Character *u=nullptr) const
Definition: monster.cpp:1086
cata::optional< time_point > lastseen_turn
Definition: monster.h:508
Attitude attitude_to(const Creature &other) const override
Attitude (of this creature) towards another creature.
Definition: npc.cpp:2077
rule_state check_monster(const std::string &creature_name_in, Creature::Attitude attitude_in, int proximity_in) const
bool empty() const
rule_state
Definition: enums.h:51
@ RULE_NONE
Definition: enums.h:52
bool is_valid_in_w_terrain(const point &p)
Definition: game.cpp:282
static const species_id PLANT("PLANT")
static const efftype_id effect_adrenaline_mycus("adrenaline_mycus")
static constexpr int MAPSIZE_X
monster_attitude
Definition: monster.h:55
@ MATT_FOLLOW
Definition: monster.h:61
@ MATT_ATTACK
Definition: monster.h:62
FMT_NOINLINE OutputIt fill(OutputIt it, size_t n, const fill_t< Char > &fill)
bool in_species(const species_id &spec) const
Definition: mtype.cpp:122

References _, ABOVECENTER, ABOVEEAST, ABOVENORTH, ABOVENORTHEAST, ABOVENORTHWEST, ABOVESOUTH, ABOVESOUTHEAST, ABOVESOUTHWEST, ABOVEWEST, Creature::add_effect(), add_msg(), monster::attitude(), monster::attitude_to(), npc::attitude_to(), BELOWCENTER, BELOWEAST, BELOWNORTH, BELOWNORTHEAST, BELOWNORTHWEST, BELOWSOUTH, BELOWSOUTHEAST, BELOWSOUTHWEST, BELOWWEST, c, cancel_activity_or_ignore_query(), CENTER, safemode::check_monster(), monster_visible_info::dangerous, direction_from(), EAST, effect_adrenaline_mycus, safemode::empty(), detail::fill(), time_duration::from_turns(), g, npc::get_attitude(), Creature::get_effect_int(), avatar::get_mon_visible(), get_safemode(), Character::get_visible_creatures(), Creature::has_effect(), Character::has_trait(), hostile_spotted_far, monster::ignoring, mtype::in_species(), is_valid_in_w_terrain(), monster::lastseen_turn, m, m_info, m_warning, MAPSIZE_X, MATT_ATTACK, MATT_FOLLOW, MAX_VIEW_DISTANCE, Character::mod_pain(), mostseen, monster::name(), monster_visible_info::new_seen_mon, NORTH, NORTHEAST, NORTHWEST, NPCATT_KILL, PLANT, Character::pos(), monster::pos(), POSX, POSY, rl_dist(), RULE_BLACKLISTED, RULE_NONE, safe_mode, SAFE_MODE_OFF, SAFE_MODE_ON, SAFE_MODE_STOP, Creature::sees(), set_safe_mode(), shared_from(), SOUTH, SOUTHEAST, SOUTHWEST, calendar::start_of_cataclysm, string_format(), calendar::turn, turnssincelastmon, monster::type, u, monster_visible_info::unique_mons, monster_visible_info::unique_types, player::view_offset, WEST, tripoint::x, tripoint::xy(), and tripoint::y.

Referenced by do_turn().

◆ monmove()

void game::monmove ( )
private

Definition at line 4048 of file game.cpp.

4049{
4050 cleanup_dead();
4051
4052 for( monster &critter : all_monsters() ) {
4053 // Critters in impassable tiles get pushed away, unless it's not impassable for them
4054 if( !critter.is_dead() && m.impassable( critter.pos() ) && !critter.can_move_to( critter.pos() ) ) {
4055 std::string msg = string_format( "%s can't move to its location! %s %s", critter.name(),
4056 critter.pos().to_string(), m.tername( critter.pos() ) );
4057 dbg( DL::Error ) << msg;
4058 add_msg( m_debug, msg );
4059 bool okay = false;
4060 for( const tripoint &dest : m.points_in_radius( critter.pos(), 3 ) ) {
4061 if( critter.can_move_to( dest ) && is_empty( dest ) ) {
4062 critter.setpos( dest );
4063 okay = true;
4064 break;
4065 }
4066 }
4067 if( !okay ) {
4068 // die of "natural" cause (overpopulation is natural)
4069 critter.die( nullptr );
4070 }
4071 }
4072
4073 if( !critter.is_dead() ) {
4074 critter.process_items();
4075 }
4076
4077 if( !critter.is_dead() ) {
4078 critter.process_turn();
4079 }
4080
4081 m.creature_in_field( critter );
4082 if( calendar::once_every( 1_days ) ) {
4083 if( critter.has_flag( MF_MILKABLE ) ) {
4084 critter.refill_udders();
4085 }
4086 critter.try_reproduce();
4087 }
4088 while( critter.moves > 0 && !critter.is_dead() && !critter.has_effect( effect_ridden ) ) {
4089 critter.made_footstep = false;
4090 // Controlled critters don't make their own plans
4091 if( !critter.has_effect( effect_ai_controlled ) ) {
4092 // Formulate a path to follow
4093 critter.plan();
4094 }
4095 critter.move(); // Move one square, possibly hit u
4096 critter.process_triggers();
4097 m.creature_in_field( critter );
4098 }
4099
4100 if( !critter.is_dead() &&
4101 u.has_active_bionic( bionic_id( "bio_alarm" ) ) &&
4102 u.get_power_level() >= 25_kJ &&
4103 rl_dist( u.pos(), critter.pos() ) <= 5 &&
4104 !critter.is_hallucination() ) {
4105 u.mod_power_level( -25_kJ );
4106 add_msg( m_warning, _( "Your motion alarm goes off!" ) );
4108 _( "Your motion alarm goes off!" ) );
4109 if( u.has_effect( efftype_id( "sleep" ) ) ) {
4110 u.wake_up();
4111 }
4112 }
4113 }
4114
4115 cleanup_dead();
4116
4117 // The remaining monsters are all alive, but may be outside of the reality bubble.
4118 // If so, despawn them. This is not the same as dying, they will be stored for later and the
4119 // monster::die function is not called.
4120 for( monster &critter : all_monsters() ) {
4121 if( critter.posx() < 0 - ( MAPSIZE_X ) / 6 ||
4122 critter.posy() < 0 - ( MAPSIZE_Y ) / 6 ||
4123 critter.posx() > ( MAPSIZE_X * 7 ) / 6 ||
4124 critter.posy() > ( MAPSIZE_Y * 7 ) / 6 ) {
4125 despawn_monster( critter );
4126 }
4127 }
4128
4129 // Now, do active NPCs.
4130 for( npc &guy : g->all_npcs() ) {
4131 int turns = 0;
4132 if( guy.is_mounted() ) {
4133 guy.check_mount_is_spooked();
4134 }
4135 m.creature_in_field( guy );
4136 if( !guy.has_effect( effect_npc_suspend ) ) {
4137 guy.process_turn();
4138 }
4139 while( !guy.is_dead() && guy.moves > 0 && turns < 10 &&
4140 ( !guy.in_sleep_state() || guy.activity.id() == ACT_OPERATION )
4141 ) {
4142 int moves = guy.moves;
4143 guy.move();
4144 if( moves == guy.moves ) {
4145 // Count every time we exit npc::move() without spending any moves.
4146 turns++;
4147 }
4148
4149 // Turn on debug mode when in infinite loop
4150 // It has to be done before the last turn, otherwise
4151 // there will be no meaningful debug output.
4152 if( turns == 9 ) {
4153 debugmsg( "NPC %s entered infinite loop. Turning on debug mode",
4154 guy.name );
4155 debug_mode = true;
4156 }
4157 }
4158
4159 // If we spun too long trying to decide what to do (without spending moves),
4160 // Invoke cognitive suspension to prevent an infinite loop.
4161 if( turns == 10 ) {
4162 add_msg( _( "%s faints!" ), guy.name );
4163 guy.reboot();
4164 }
4165
4166 if( !guy.is_dead() ) {
4167 guy.npc_update_body();
4168 }
4169 }
4170 cleanup_dead();
4171}
void mod_power_level(const units::energy &npower)
Definition: character.cpp:2039
units::energy get_power_level() const
Definition: character.cpp:2019
void wake_up()
Definition: avatar.cpp:958
static const activity_id ACT_OPERATION("ACT_OPERATION")
static const efftype_id effect_npc_suspend("npc_suspend")
static const efftype_id effect_ai_controlled("ai_controlled")
static constexpr int MAPSIZE_Y
@ MF_MILKABLE
Definition: mtype.h:167

References _, ACT_OPERATION, add_msg(), alert, all_monsters(), cancel_activity_or_ignore_query(), cleanup_dead(), map::creature_in_field(), dbg, debug_mode, debugmsg, despawn_monster(), effect_ai_controlled, effect_npc_suspend, effect_ridden, Error, g, Character::get_power_level(), Character::has_active_bionic(), Creature::has_effect(), map::impassable(), is_empty(), m, m_debug, m_warning, MAPSIZE_X, MAPSIZE_Y, MF_MILKABLE, Character::mod_power_level(), calendar::once_every(), map::points_in_radius(), Character::pos(), rl_dist(), string_format(), map::tername(), u, and avatar::wake_up().

Referenced by do_turn().

◆ mouse_edge_scrolling()

std::pair< tripoint, tripoint > game::mouse_edge_scrolling ( input_context ctxt,
int  speed,
const tripoint last,
bool  iso 
)
private

Definition at line 2023 of file game.cpp.

2025{
2026 const int rate = get_option<int>( "EDGE_SCROLL" );
2027 auto ret = std::make_pair( tripoint_zero, last );
2028 if( rate == -1 ) {
2029 // Fast return when the option is disabled.
2030 return ret;
2031 }
2032 // Ensure the parameters are used even if the #if below is false
2033 ( void ) ctxt;
2034 ( void ) speed;
2035 ( void ) iso;
2036#if (defined TILES || defined _WIN32 || defined WINDOWS)
2037 auto now = std::chrono::steady_clock::now();
2038 if( now < last_mouse_edge_scroll + std::chrono::milliseconds( rate ) ) {
2039 return ret;
2040 } else {
2042 }
2043 const input_event event = ctxt.get_raw_input();
2044 if( event.type == CATA_INPUT_MOUSE ) {
2045 const point threshold( projected_window_width() / 100, projected_window_height() / 100 );
2046 if( event.mouse_pos.x <= threshold.x ) {
2047 ret.first.x -= speed;
2048 if( iso ) {
2049 ret.first.y -= speed;
2050 }
2051 } else if( event.mouse_pos.x >= projected_window_width() - threshold.x ) {
2052 ret.first.x += speed;
2053 if( iso ) {
2054 ret.first.y += speed;
2055 }
2056 }
2057 if( event.mouse_pos.y <= threshold.y ) {
2058 ret.first.y -= speed;
2059 if( iso ) {
2060 ret.first.x += speed;
2061 }
2062 } else if( event.mouse_pos.y >= projected_window_height() - threshold.y ) {
2063 ret.first.y += speed;
2064 if( iso ) {
2065 ret.first.x -= speed;
2066 }
2067 }
2068 ret.second = ret.first;
2069 } else if( event.type == CATA_INPUT_TIMEOUT ) {
2070 ret.first = ret.second;
2071 }
2072#endif
2073 return ret;
2074}
@ CATA_INPUT_TIMEOUT
Definition: input.h:81
@ CATA_INPUT_MOUSE
Definition: input.h:84

References CATA_INPUT_MOUSE, CATA_INPUT_TIMEOUT, input_context::get_raw_input(), iso, last, last_mouse_edge_scroll, cata::hash64_detail::ret, tripoint_zero, point::x, and point::y.

Referenced by mouse_edge_scrolling_overmap(), and mouse_edge_scrolling_terrain().

◆ mouse_edge_scrolling_overmap()

tripoint game::mouse_edge_scrolling_overmap ( input_context ctxt)

This variant is suitable for the overmap.

Definition at line 2085 of file game.cpp.

2086{
2087 // overmap has no iso mode
2091 return ret.first;
2092}
std::pair< tripoint, tripoint > mouse_edge_scrolling(input_context &ctxt, int speed, const tripoint &last, bool iso)
Definition: game.cpp:2023
tripoint last_mouse_edge_scroll_vector_terrain
Definition: game.h:1069
tripoint last_mouse_edge_scroll_vector_overmap
Definition: game.h:1070

References last_mouse_edge_scroll_vector_overmap, last_mouse_edge_scroll_vector_terrain, mouse_edge_scrolling(), cata::hash64_detail::ret, and tripoint_zero.

◆ mouse_edge_scrolling_terrain()

tripoint game::mouse_edge_scrolling_terrain ( input_context ctxt)

Used to implement mouse "edge scrolling".

Returns a tripoint which is a vector of the resulting "move", i.e. (0, 0, 0) if the mouse is not at the edge of the screen, otherwise some (x, y, 0) depending on which edges are hit. This variant adjust scrolling speed according to zoom level, making it suitable when viewing the "terrain".

Definition at line 2076 of file game.cpp.

References DEFAULT_TILESET_ZOOM, last_mouse_edge_scroll_vector_overmap, last_mouse_edge_scroll_vector_terrain, mouse_edge_scrolling(), cata::hash64_detail::ret, tile_iso, tileset_zoom, and tripoint_zero.

Referenced by look_around().

◆ move_save_to_graveyard()

void game::move_save_to_graveyard ( const std::string &  dirname)
private

Definition at line 2460 of file game.cpp.

2461{
2462 const std::string save_dir = get_world_base_save_path();
2463 const std::string graveyard_dir = PATH_INFO::graveyarddir() + "/";
2464 const std::string graveyard_save_dir = graveyard_dir + dirname + "/";
2465 const std::string prefix = base64_encode( u.name ) + ".";
2466
2467 if( !assure_dir_exist( graveyard_dir ) ) {
2468 debugmsg( "could not create graveyard path '%s'", graveyard_dir );
2469 }
2470
2471 if( !assure_dir_exist( graveyard_save_dir ) ) {
2472 debugmsg( "could not create graveyard path '%s'", graveyard_save_dir );
2473 }
2474
2475 const auto save_files = get_files_from_path( prefix, save_dir );
2476 if( save_files.empty() ) {
2477 debugmsg( "could not find save files in '%s'", save_dir );
2478 }
2479
2480 for( const auto &src_path : save_files ) {
2481 const std::string dst_path = graveyard_save_dir +
2482 src_path.substr( src_path.rfind( '/' ), std::string::npos );
2483
2484 if( rename_file( src_path, dst_path ) ) {
2485 continue;
2486 }
2487
2488 debugmsg( "could not rename file '%s' to '%s'", src_path, dst_path );
2489
2490 if( remove_file( src_path ) ) {
2491 continue;
2492 }
2493
2494 debugmsg( "could not remove file '%s'", src_path );
2495 }
2496}
@ prefix
Definition: enums.h:79
bool remove_file(const std::string &path)
Remove a file.
Definition: filesystem.cpp:89
bool assure_dir_exist(const std::string &path)
Create directory if it does not exist.
Definition: filesystem.cpp:48
bool rename_file(const std::string &old_path, const std::string &new_path)
Rename a file, overwriting the target.
Definition: filesystem.cpp:105
std::vector< std::string > get_files_from_path(const std::string &pattern, const std::string &root_path, const bool recursive_search, const bool match_extension)
Returns a vector of files or directories matching pattern at root_path.
Definition: filesystem.cpp:362
std::string graveyarddir()
Definition: path_info.cpp:202

References assure_dir_exist(), base64_encode(), debugmsg, get_files_from_path(), get_world_base_save_path(), PATH_INFO::graveyarddir(), Character::name, prefix, remove_file(), rename_file(), and u.

Referenced by cleanup_at_end().

◆ moving_vehicle_dismount()

void game::moving_vehicle_dismount ( const tripoint dest_loc)

Handles players exiting from moving vehicles.

Definition at line 5104 of file game.cpp.

5105{
5106 const optional_vpart_position vp = m.veh_at( u.pos() );
5107 if( !vp ) {
5108 debugmsg( "Tried to exit non-existent vehicle." );
5109 return;
5110 }
5111 vehicle *const veh = &vp->vehicle();
5112 if( u.pos() == dest_loc ) {
5113 debugmsg( "Need somewhere to dismount towards." );
5114 return;
5115 }
5116 tileray ray( dest_loc.xy() + point( -u.posx(), -u.posy() ) );
5117 // TODO:: make dir() const correct!
5118 const units::angle d = ray.dir();
5119 add_msg( _( "You dive from the %s." ), veh->name );
5120 m.unboard_vehicle( u.pos() );
5121 u.moves -= 200;
5122 // Dive three tiles in the direction of tox and toy
5123 fling_creature( &u, d, 30, true );
5124 // Hit the ground according to vehicle speed
5125 if( !m.has_flag( "SWIMMABLE", u.pos() ) ) {
5126 if( veh->velocity > 0 ) {
5127 fling_creature( &u, veh->face.dir(), veh->velocity / static_cast<float>( 100 ) );
5128 } else {
5129 fling_creature( &u, veh->face.dir() + 180_degrees,
5130 -( veh->velocity ) / static_cast<float>( 100 ) );
5131 }
5132 }
5133}
void fling_creature(Creature *c, const units::angle &dir, float flvel, bool controlled=false, bool suppress_map_update=false)
Flings the input creature in the given direction.
Definition: game.cpp:9713

References _, add_msg(), debugmsg, tileray::dir(), vehicle::face, fling_creature(), map::has_flag(), m, Creature::moves, vehicle::name, Character::pos(), Character::posx(), Character::posy(), u, map::unboard_vehicle(), map::veh_at(), vehicle::velocity, and tripoint::xy().

◆ natural_light_level()

float game::natural_light_level ( int  zlev) const

Definition at line 3477 of file game.cpp.

3478{
3479 // ignore while underground or above limits
3480 if( zlev > OVERMAP_HEIGHT || zlev < 0 ) {
3481 return LIGHT_AMBIENT_MINIMAL;
3482 }
3483
3484 if( latest_lightlevels[zlev] > -std::numeric_limits<float>::max() ) {
3485 // Already found the light level for now?
3486 return latest_lightlevels[zlev];
3487 }
3488
3489 float ret = LIGHT_AMBIENT_MINIMAL;
3490
3491 // Sunlight/moonlight related stuff
3493 if( !weather.lightning_active ) {
3495 } else {
3496 // Recent lightning strike has lit the area
3498 }
3499
3501
3502 // Artifact light level changes here. Even though some of these only have an effect
3503 // aboveground it is cheaper performance wise to simply iterate through the entire
3504 // list once instead of twice.
3505 float mod_ret = -1;
3506 // Each artifact change does std::max(mod_ret, new val) since a brighter end value
3507 // will trump a lower one.
3508 if( const timed_event *e = timed_events.get( TIMED_EVENT_DIM ) ) {
3509 // TIMED_EVENT_DIM slowly dims the natural sky level, then relights it.
3510 const time_duration left = e->when - calendar::turn;
3511 // TIMED_EVENT_DIM has an occurrence date of turn + 50, so the first 25 dim it,
3512 if( left > 25_turns ) {
3513 mod_ret = std::max( static_cast<double>( mod_ret ), ( ret * ( left - 25_turns ) ) / 25_turns );
3514 // and the last 25 scale back towards normal.
3515 } else {
3516 mod_ret = std::max( static_cast<double>( mod_ret ), ( ret * ( 25_turns - left ) ) / 25_turns );
3517 }
3518 }
3520 // TIMED_EVENT_ARTIFACT_LIGHT causes everywhere to become as bright as day.
3521 mod_ret = std::max<float>( ret, default_daylight_level() );
3522 }
3523 // If we had a changed light level due to an artifact event then it overwrites
3524 // the natural light level.
3525 if( mod_ret > -1 ) {
3526 ret = mod_ret;
3527 }
3528
3529 // Cap everything to our minimum light level
3530 ret = std::max<float>( LIGHT_AMBIENT_MINIMAL, ret );
3531
3532 latest_lightlevels[zlev] = ret;
3533
3534 return ret;
3535}
double default_daylight_level()
How much light is provided in full daylight.
Definition: calendar.cpp:62
float sunlight(const time_point &p, const bool vision)
Returns the current sunlight or moonlight level through the preceding functions.
Definition: calendar.cpp:199
std::array< float, OVERMAP_LAYERS > latest_lightlevels
Definition: game.h:1042
bool queued(timed_event_type type) const
timed_event * get(timed_event_type type)
weather_type_id weather_id
Definition: weather.h:193
static constexpr float LIGHT_AMBIENT_MINIMAL
Definition: lightmap.h:12
@ TIMED_EVENT_DIM
Definition: timed_event.h:22
@ TIMED_EVENT_ARTIFACT_LIGHT
Definition: timed_event.h:23

References default_daylight_level(), timed_event_manager::get(), get_weather, latest_lightlevels, left, LIGHT_AMBIENT_MINIMAL, weather_type::light_modifier, OVERMAP_HEIGHT, timed_event_manager::queued(), cata::hash64_detail::ret, sunlight(), TIMED_EVENT_ARTIFACT_LIGHT, TIMED_EVENT_DIM, timed_events, calendar::turn, and weather_manager::weather_id.

Referenced by light_level().

◆ npc_menu()

bool game::npc_menu ( npc who)

Returns true if the menu handled stuff and player shouldn't do anything else.

Perception slightly increases precision when examining NPCs' wounds Firstaid increases precision when examining NPCs' wounds

Definition at line 5235 of file game.cpp.

5236{
5237 enum choices : int {
5238 talk = 0,
5239 swap_pos,
5240 push,
5241 examine_wounds,
5242 use_item,
5243 sort_armor,
5244 attack,
5245 disarm,
5246 steal
5247 };
5248
5249 const bool obeys = debug_mode || ( who.is_player_ally() && !who.in_sleep_state() );
5250
5251 uilist amenu;
5252
5253 amenu.text = string_format( _( "What to do with %s?" ), who.disp_name() );
5254 amenu.addentry( talk, true, 't', _( "Talk" ) );
5255 amenu.addentry( swap_pos, obeys && !who.is_mounted() &&
5256 !u.is_mounted(), 's', _( "Swap positions" ) );
5257 amenu.addentry( push, obeys && !who.is_mounted(), 'p', _( "Push away" ) );
5258 amenu.addentry( examine_wounds, true, 'w', _( "Examine wounds" ) );
5259 amenu.addentry( use_item, true, 'i', _( "Use item on" ) );
5260 amenu.addentry( sort_armor, true, 'r', _( "Sort armor" ) );
5261 amenu.addentry( attack, true, 'a', _( "Attack" ) );
5262 if( !who.is_player_ally() ) {
5263 amenu.addentry( disarm, who.is_armed(), 'd', _( "Disarm" ) );
5264 amenu.addentry( steal, !who.is_enemy(), 'S', _( "Steal" ) );
5265 }
5266
5267 amenu.query();
5268
5269 const int choice = amenu.ret;
5270 if( choice == talk ) {
5271 who.talk_to_u();
5272 } else if( choice == swap_pos ) {
5273 if( !prompt_dangerous_tile( who.pos() ) ) {
5274 return true;
5275 }
5276 // TODO: Make NPCs protest when displaced onto dangerous crap
5277 add_msg( _( "You swap places with %s." ), who.name );
5278 swap_critters( u, who );
5279 // TODO: Make that depend on stuff
5280 u.mod_moves( -200 );
5281 } else if( choice == push ) {
5282 // TODO: Make NPCs protest when displaced onto dangerous crap
5283 tripoint oldpos = who.pos();
5284 who.move_away_from( u.pos(), true );
5285 u.mod_moves( -20 );
5286 if( oldpos != who.pos() ) {
5287 add_msg( _( "%s moves out of the way." ), who.name );
5288 } else {
5289 add_msg( m_warning, _( "%s has nowhere to go!" ), who.name );
5290 }
5291 } else if( choice == examine_wounds ) {
5292 ///\EFFECT_PER slightly increases precision when examining NPCs' wounds
5293
5294 ///\EFFECT_FIRSTAID increases precision when examining NPCs' wounds
5295 const bool precise = u.get_skill_level( skill_firstaid ) * 4 + u.per_cur >= 20;
5296 who.body_window( _( "Limbs of: " ) + who.disp_name(), true, precise, 0, 0, 0, 0.0f, 0.0f, 0.0f,
5297 0.0f, 0.0f );
5298 } else if( choice == use_item ) {
5299 static const std::string heal_string( "heal" );
5300 const auto will_accept = []( const item & it ) {
5301 const auto use_fun = it.get_use( heal_string );
5302 if( use_fun == nullptr ) {
5303 return false;
5304 }
5305
5306 const auto *actor = dynamic_cast<const heal_actor *>( use_fun->get_actor_ptr() );
5307
5308 return actor != nullptr &&
5309 actor->limb_power >= 0 &&
5310 actor->head_power >= 0 &&
5311 actor->torso_power >= 0;
5312 };
5313 item_location loc = game_menus::inv::titled_filter_menu( will_accept, u, _( "Use which item?" ) );
5314
5315 if( !loc ) {
5316 add_msg( _( "Never mind" ) );
5317 return false;
5318 }
5319 item &used = *loc;
5320 bool did_use = u.invoke_item( &used, heal_string, who.pos() );
5321 if( did_use ) {
5322 // Note: exiting a body part selection menu counts as use here
5323 u.mod_moves( -300 );
5324 }
5325 } else if( choice == sort_armor ) {
5326 who.sort_armor();
5327 u.mod_moves( -100 );
5328 } else if( choice == attack ) {
5329 if( who.is_enemy() || query_yn( _( "You may be attacked! Proceed?" ) ) ) {
5330 u.melee_attack( who, true );
5331 who.on_attacked( u );
5332 }
5333 } else if( choice == disarm ) {
5334 if( who.is_enemy() || query_yn( _( "You may be attacked! Proceed?" ) ) ) {
5335 u.disarm( who );
5336 }
5337 } else if( choice == steal && query_yn( _( "You may be attacked! Proceed?" ) ) ) {
5338 u.steal( who );
5339 }
5340
5341 return true;
5342}
hp_part body_window(const std::string &menu_header, bool show_all, bool precise, int normal_bonus, int head_bonus, int torso_bonus, float bleed, float bite, float infect, float bandage_power, float disinfectant_power) const
Displays menu with body part hp, optionally with hp estimation after healing.
Definition: character.cpp:5730
bool in_sleep_state() const override
Definition: character.cpp:9230
void melee_attack(Creature &t, bool allow_special, const matec_id *force_technique=nullptr, bool allow_unarmed=true)
Sets up a melee attack and handles melee attack function calls.
Definition: melee.cpp:384
int per_cur
Definition: character.h:268
void steal(npc &target)
Try to steal an item from the NPC's inventory.
Definition: melee.cpp:2385
bool prompt_dangerous_tile(const tripoint &dest_loc) const
Definition: game.cpp:8653
bool swap_critters(Creature &, Creature &)
Swaps positions of two creatures.
Definition: game.cpp:4729
float limb_power
How much hp to restore when healing limbs?
Definition: iuse_actor.h:1011
void talk_to_u(bool radio_contact=false)
Definition: npctalk.cpp:733
void on_attacked(const Creature &attacker)
Definition: npc.cpp:1449
void move_away_from(const tripoint &p, bool no_bash_atk=false, std::set< tripoint > *nomove=nullptr)
Definition: npcmove.cpp:2521
void disarm(npc &target)
Try to disarm the NPC.
Definition: melee.cpp:2309
static const skill_id skill_firstaid("firstaid")
static void swap_pos(Creature &caster, const tripoint &target)
item_location steal(avatar &you, player &victim)
Menu for stealing stuff.
item_location titled_filter_menu(item_filter filter, avatar &you, const std::string &title, const std::string &none_message="")
void push(monster &z)
Definition: monexamine.cpp:610

References _, add_msg(), uilist::addentry(), Character::body_window(), debug_mode, player::disarm(), Character::disp_name(), Character::get_skill_level(), Character::in_sleep_state(), avatar::invoke_item(), Character::is_armed(), npc::is_enemy(), Character::is_mounted(), npc::is_player_ally(), heal_actor::limb_power, m_warning, Character::melee_attack(), Creature::mod_moves(), npc::move_away_from(), Character::name, npc::on_attacked(), Character::per_cur, Character::pos(), prompt_dangerous_tile(), monexamine::push(), uilist::query(), query_yn(), uilist::ret, skill_firstaid, player::sort_armor(), game_menus::inv::steal(), avatar::steal(), string_format(), swap_critters(), swap_pos(), npc::talk_to_u(), uilist::text, game_menus::inv::titled_filter_menu(), u, and avatar_action::use_item().

Referenced by examine().

◆ num_creatures()

size_t game::num_creatures ( ) const

Returns the approximate number of creatures in the reality bubble.

Because of performance restrictions it may return a slightly incorrect values (as it includes dead, but not yet cleaned up creatures).

Definition at line 4674 of file game.cpp.

4675{
4676 return critter_tracker->size() + active_npc.size() + 1; // 1 == g->u
4677}

References active_npc, and critter_tracker.

Referenced by display_visibility(), and fungal_effects::fungalize().

◆ on_move_effects()

void game::on_move_effects ( )

Definition at line 9671 of file game.cpp.

9672{
9673 // TODO: Move this to a character method
9674 if( !u.is_mounted() ) {
9675 const item muscle( "muscle" );
9676 for( const bionic_id &bid : u.get_bionic_fueled_with( muscle ) ) {
9677 if( u.has_active_bionic( bid ) ) {// active power gen
9678 u.mod_power_level( units::from_kilojoule( muscle.fuel_energy() ) * bid->fuel_efficiency );
9679 } else if( u.has_bionic( bid ) ) {// passive power gen
9680 u.mod_power_level( units::from_kilojoule( muscle.fuel_energy() ) * bid->passive_fuel_efficiency );
9681 }
9682 }
9683
9684 if( u.has_active_bionic( bionic_id( "bio_jointservo" ) ) ) {
9685 if( u.movement_mode_is( CMM_RUN ) ) {
9686 u.mod_power_level( -55_J );
9687 } else {
9688 u.mod_power_level( -35_J );
9689 }
9690 }
9691 }
9692
9693 if( u.movement_mode_is( CMM_RUN ) ) {
9694 if( !u.can_run() ) {
9696 }
9697 }
9698
9699 // apply martial art move bonuses
9700 u.martial_arts_data->ma_onmove_effects( u );
9701
9703}
@ CMM_RUN
Definition: character.h:103
bool can_run()
source of truth of whether a Character can run
Definition: character.cpp:1384
bool movement_mode_is(character_movemode mode) const
Check against the character's current movement mode.
Definition: character.cpp:1674
std::vector< bionic_id > get_bionic_fueled_with(const item &it) const
Return bionic_id of bionics able to use it as fuel.
Definition: character.cpp:1980
bool has_bionic(const bionic_id &b) const
Returns true if the player has the entered bionic id.
Definition: character.cpp:1929
void do_ambient()
Definition: sounds.cpp:1616
constexpr quantity< value_type, energy_in_joule_tag > from_kilojoule(const value_type v)
Definition: units_energy.h:32

References Character::can_run(), CMM_RUN, sfx::do_ambient(), units::from_kilojoule(), item::fuel_energy(), Character::get_bionic_fueled_with(), Character::has_active_bionic(), Character::has_bionic(), Character::is_mounted(), Character::martial_arts_data, Character::mod_power_level(), Character::movement_mode_is(), avatar::toggle_run_mode(), and u.

Referenced by phasing_move(), and walk_move().

◆ on_options_changed()

void game::on_options_changed ( )

Should be invoked whenever options change.

Definition at line 9705 of file game.cpp.

9706{
9707#if defined(TILES)
9708 tilecontext->on_options_changed();
9709#endif
9710 grid_tracker_ptr->on_options_changed();
9711}

References grid_tracker_ptr.

◆ open_consume_item_menu()

void game::open_consume_item_menu ( )
private

Definition at line 1493 of file handle_action.cpp.

1494{
1495 uilist as_m;
1496
1497 as_m.text = _( "What do you want to consume?" );
1498
1499 as_m.entries.emplace_back( 0, true, 'f', _( "Food" ) );
1500 as_m.entries.emplace_back( 1, true, 'd', _( "Drink" ) );
1501 as_m.entries.emplace_back( 2, true, 'm', _( "Medication" ) );
1502 as_m.query();
1503
1504 switch( as_m.ret ) {
1505 case 0:
1507 break;
1508 case 1:
1510 break;
1511 case 2:
1513 break;
1514 default:
1515 break;
1516 }
1517}
std::vector< uilist_entry > entries
Definition: ui.h:323
item_location consume_drink(player &p)
Consuming a drink item via a custom menu.
item_location consume_meds(player &p)
Consuming a medication item via a custom menu.
item_location consume_food(player &p)
Consuming a food item via a custom menu.

References _, game_menus::inv::consume_drink(), game_menus::inv::consume_food(), game_menus::inv::consume_meds(), avatar_action::eat(), uilist::entries, uilist::query(), uilist::ret, uilist::text, and u.

Referenced by handle_action().

◆ overmap_npc_move()

void game::overmap_npc_move ( )
private

Definition at line 4173 of file game.cpp.

4174{
4175 std::vector<npc *> travelling_npcs;
4176 static constexpr int move_search_radius = 600;
4177 for( auto &elem : overmap_buffer.get_npcs_near_player( move_search_radius ) ) {
4178 if( !elem ) {
4179 continue;
4180 }
4181 npc *npc_to_add = elem.get();
4182 if( ( !npc_to_add->is_active() || rl_dist( u.pos(), npc_to_add->pos() ) > SEEX * 2 ) &&
4183 npc_to_add->mission == NPC_MISSION_TRAVELLING ) {
4184 travelling_npcs.push_back( npc_to_add );
4185 }
4186 }
4187 for( auto &elem : travelling_npcs ) {
4188 if( elem->has_omt_destination() ) {
4189 if( !elem->omt_path.empty() && rl_dist( elem->omt_path.back(), elem->global_omt_location() ) > 2 ) {
4190 //recalculate path, we got distracted doing something else probably
4191 elem->omt_path.clear();
4192 }
4193 if( elem->omt_path.empty() ) {
4194 const tripoint_abs_omt &from = elem->global_omt_location();
4195 const tripoint_abs_omt &to = elem->goal;
4196 elem->omt_path = overmap_buffer.get_travel_path( elem->global_omt_location(), elem->goal,
4198 if( elem->omt_path.empty() ) {
4199 add_msg( m_debug, "%s couldn't find overmap path from %s to %s",
4200 elem->get_name(), from.to_string(), to.to_string() );
4201 elem->goal = npc::no_goal_point;
4202 elem->mission = NPC_MISSION_NULL;
4203 }
4204 } else {
4205 if( elem->omt_path.back() == elem->global_omt_location() ) {
4206 elem->omt_path.pop_back();
4207 }
4208 // TODO: fix point types
4209 elem->travel_overmap(
4210 project_to<coords::sm>( elem->omt_path.back() ).raw() );
4211 }
4212 reload_npcs();
4213 }
4214 }
4215 return;
4216}
std::vector< tripoint_abs_omt > omt_path
Route for overmap scale traveling.
Definition: character.h:1809
static constexpr tripoint_abs_omt no_goal_point
Definition: npc.h:1337
bool is_active() const
Definition: npc.cpp:2195
std::vector< tripoint_abs_omt > get_travel_path(const tripoint_abs_omt &src, const tripoint_abs_omt &dest, overmap_path_params params)
@ NPC_MISSION_NULL
Definition: npc.h:179
@ NPC_MISSION_TRAVELLING
Definition: npc.h:191
static overmap_path_params for_npc()

References add_msg(), overmap_path_params::for_npc(), overmapbuffer::get_npcs_near_player(), overmapbuffer::get_travel_path(), npc::is_active(), m_debug, npc::mission, npc::no_goal_point, NPC_MISSION_NULL, NPC_MISSION_TRAVELLING, Character::omt_path, overmap_buffer, Character::pos(), reload_npcs(), rl_dist(), SEEX, coords::coord_point< Point, Origin, Scale >::to_string(), and u.

Referenced by do_turn().

◆ peek() [1/2]

void game::peek ( )

Definition at line 5595 of file game.cpp.

5596{
5597 const cata::optional<tripoint> p = choose_direction( _( "Peek where?" ), true );
5598 if( !p ) {
5599 return;
5600 }
5601
5602 if( p->z != 0 ) {
5603 const tripoint old_pos = u.pos();
5604 vertical_move( p->z, false, true );
5605
5606 if( old_pos != u.pos() ) {
5607 look_around();
5608 vertical_move( p->z * -1, false, true );
5609 }
5610 return;
5611 }
5612
5613 if( m.impassable( u.pos() + *p ) || m.obstructed_by_vehicle_rotation( u.pos(), u.pos() + *p ) ) {
5614 return;
5615 }
5616
5617 peek( u.pos() + *p );
5618}
cata::optional< tripoint > choose_direction(const std::string &message, const bool allow_vertical)
Request player input of a direction, possibly including vertical component.
Definition: action.cpp:984

References _, choose_direction(), map::impassable(), look_around(), m, map::obstructed_by_vehicle_rotation(), peek(), Character::pos(), u, and vertical_move().

Referenced by handle_action(), and peek().

◆ peek() [2/2]

void game::peek ( const tripoint p)

Definition at line 5620 of file game.cpp.

5621{
5622 u.moves -= 200;
5623 tripoint prev = u.pos();
5624 u.setpos( p );
5625 tripoint center = p;
5626 const look_around_result result = look_around( /*show_window=*/true, center, center, false, false,
5627 true );
5628 u.setpos( prev );
5629
5630 if( result.peek_action && *result.peek_action == PA_BLIND_THROW ) {
5631 item_location loc;
5632 avatar_action::plthrow( u, loc, p );
5633 }
5635}

References center, map::invalidate_map_cache(), look_around(), m, Creature::moves, PA_BLIND_THROW, avatar_action::plthrow(), Character::pos(), Character::setpos(), u, and tripoint::z.

◆ perhaps_add_random_npc()

void game::perhaps_add_random_npc ( )
private

Definition at line 11002 of file game.cpp.

11003{
11004 if( !calendar::once_every( 1_hours ) ) {
11005 return;
11006 }
11007 // Create a new NPC?
11008 // Only allow NPCs on 0 z-level, otherwise they can bug out due to lack of spots
11009 if( !get_option<bool>( "RANDOM_NPC" ) || ( !m.has_zlevels() && get_levz() != 0 ) ) {
11010 return;
11011 }
11012
11013 float density = get_option<float>( "NPC_DENSITY" );
11014 static constexpr int density_search_radius = 60;
11015 const float npc_num = overmap_buffer.get_npcs_near_player( density_search_radius ).size();
11016 if( npc_num > 0.0 ) {
11017 // 100%, 80%, 64%, 52%, 41%, 33%...
11018 density *= std::pow( 0.8f, npc_num );
11019 }
11020
11021 if( !x_in_y( density, 100 ) ) {
11022 return;
11023 }
11024 bool spawn_allowed = false;
11026 int counter = 0;
11027 while( !spawn_allowed ) {
11028 if( counter >= 10 ) {
11029 return;
11030 }
11031 static constexpr int radius_spawn_range = 120;
11032 const tripoint_abs_omt u_omt = u.global_omt_location();
11033 spawn_point = u_omt + point( rng( -radius_spawn_range, radius_spawn_range ),
11034 rng( -radius_spawn_range, radius_spawn_range ) );
11035 spawn_point.z() = 0;
11036 const oter_id oter = overmap_buffer.ter( spawn_point );
11037 // shouldn't spawn on lakes or rivers.
11038 if( !is_river_or_lake( oter ) ) {
11039 spawn_allowed = true;
11040 }
11041 counter += 1;
11042 }
11043 shared_ptr_fast<npc> tmp = make_shared_fast<npc>();
11044 tmp->normalize();
11045 tmp->randomize();
11046 std::string new_fac_id = "solo_";
11047 new_fac_id += tmp->name;
11048 // create a new "lone wolf" faction for this one NPC
11049 faction *new_solo_fac = faction_manager_ptr->add_new_faction( tmp->name, faction_id( new_fac_id ),
11050 faction_id( "no_faction" ) );
11051 tmp->set_fac( new_solo_fac ? new_solo_fac->id : faction_id( "no_faction" ) );
11052 // adds the npc to the correct overmap.
11053 // Only spawn random NPCs on z-level 0
11054 // TODO: fix point types
11055 tripoint submap_spawn = omt_to_sm_copy( spawn_point.raw() );
11056 tmp->spawn_at_sm( tripoint( submap_spawn.xy(), 0 ) );
11058 tmp->form_opinion( u );
11059 tmp->mission = NPC_MISSION_NULL;
11060 tmp->long_term_goal_action();
11061 tmp->add_new_mission( mission::reserve_random( ORIGIN_ANY_NPC, tmp->global_omt_location(),
11062 tmp->getID() ) );
11063 // This will make the new NPC active- if its nearby to the player
11064 load_npcs();
11065}
faction_id id
Definition: faction.h:82
point omt_to_sm_copy(const point &p)
@ ORIGIN_ANY_NPC
Definition: mission.h:46
bool is_river_or_lake(const oter_id &ter)
Definition: overmap.cpp:563

References faction_manager_ptr, get_levz(), overmapbuffer::get_npcs_near_player(), Character::global_omt_location(), map::has_zlevels(), faction_template::id, overmapbuffer::insert_npc(), is_river_or_lake(), load_npcs(), m, NPC_MISSION_NULL, omt_to_sm_copy(), calendar::once_every(), ORIGIN_ANY_NPC, overmap_buffer, mission::reserve_random(), rng(), overmapbuffer::ter(), u, x_in_y(), and tripoint::xy().

Referenced by do_turn().

◆ phasing_move()

bool game::phasing_move ( const tripoint dest,
bool  via_ramp = false 
)

Definition at line 9403 of file game.cpp.

9404{
9405 if( dest_loc.z != u.posz() && !via_ramp ) {
9406 // No vertical phasing yet
9407 return false;
9408 }
9409
9410 //probability travel through walls but not water
9411 tripoint dest = dest_loc;
9412 // tile is impassable
9413 int tunneldist = 0;
9414 const point d( sgn( dest.x - u.posx() ), sgn( dest.y - u.posy() ) );
9415 while( m.impassable( dest ) ||
9416 ( critter_at( dest ) != nullptr && tunneldist > 0 ) ) {
9417 //add 1 to tunnel distance for each impassable tile in the line
9418 tunneldist += 1;
9419 //Being dimensionally anchored prevents quantum shenanigans.
9420 if( u.worn_with_flag( "DIMENSIONAL_ANCHOR" ) || u.has_effect_with_flag( "DIMENSIONAL_ANCHOR" ) ) {
9422 _( "You try to quantum tunnel through the barrier, but something holds you back!" ) );
9423 return false;
9424 }
9425
9426 if( tunneldist > 24 ) {
9427 add_msg( m_info, _( "It's too dangerous to tunnel that far!" ) );
9428 return false;
9429 }
9430
9431 dest.x += d.x;
9432 dest.y += d.y;
9433 }
9434
9435 if( tunneldist != 0 ) {
9436 if( ( tunneldist - 1 ) * 100_kJ
9437 > //The first 100 was already taken up by the bionic's activation cost.
9438 u.get_power_level() ) { //oops, not enough energy! Tunneling costs 100 bionic power per impassable tile
9439 if( tunneldist * 100_kJ >
9441 add_msg( _( "You try to quantum tunnel through the barrier but bounce off! You don't have enough bionic power capacity to travel that far." ) );
9442 } else {
9443 add_msg( _( "You try to quantum tunnel through the barrier but are reflected! You need %i bionic power to travel that thickness of material." ),
9444 ( 100 * tunneldist ) );
9445 }
9446 return false;
9447 }
9448
9449 if( u.in_vehicle ) {
9450 m.unboard_vehicle( u.pos() );
9451 }
9452
9453 add_msg( _( "You quantum tunnel through the %d-tile wide barrier!" ), tunneldist );
9454 //tunneling costs 100 bionic power per impassable tile, but the first 100 was already drained by activation.
9455 u.mod_power_level( -( ( tunneldist - 1 ) * 100_kJ ) );
9456 //tunneling costs 100 moves baseline, 50 per extra tile up to a cap of 500 moves
9457 u.moves -= ( 50 + ( tunneldist * 50 ) );
9458 u.setpos( dest );
9459
9460 if( m.veh_at( u.pos() ).part_with_feature( "BOARDABLE", true ) ) {
9461 m.board_vehicle( u.pos(), &u );
9462 }
9463
9464 u.grab( OBJECT_NONE );
9466 m.creature_on_trap( u );
9467 return true;
9468 }
9469
9470 return false;
9471}
bool worn_with_flag(const std::string &flag, const bodypart_id &bp=bodypart_str_id::NULL_ID()) const
Returns true if the player is wearing an item with the given flag.
Definition: character.cpp:3327
units::energy get_max_power_level() const
Definition: character.cpp:2024
bool has_effect_with_flag(const std::string &flag, body_part bp=num_bp) const
Check if creature has any effect with the given flag.
Definition: creature.cpp:1206
void on_move_effects()
Definition: game.cpp:9671
void board_vehicle(const tripoint &p, player *pl)
Definition: map.cpp:1049
constexpr int sgn(const T x)
Definition: enums.h:8

References _, add_msg(), player::add_msg_if_player(), map::board_vehicle(), map::creature_on_trap(), critter_at(), Character::get_max_power_level(), Character::get_power_level(), avatar::grab(), Creature::has_effect_with_flag(), map::impassable(), Character::in_vehicle, m, m_info, Character::mod_power_level(), Creature::moves, OBJECT_NONE, on_move_effects(), Character::pos(), Character::posx(), Character::posy(), Character::posz(), Character::setpos(), sgn(), u, map::unboard_vehicle(), map::veh_at(), Character::worn_with_flag(), point::x, tripoint::x, point::y, tripoint::y, and tripoint::z.

◆ pickup() [1/2]

void game::pickup ( )
private

Definition at line 5566 of file game.cpp.

5567{
5568 const cata::optional<tripoint> examp_ = choose_adjacent_highlight( _( "Pickup where?" ),
5569 _( "There is nothing to pick up nearby." ),
5570 ACTION_PICKUP, false );
5571 if( !examp_ ) {
5572 return;
5573 }
5574 pickup( *examp_ );
5575}

References _, ACTION_PICKUP, choose_adjacent_highlight(), and pickup().

Referenced by handle_action(), and pickup().

◆ pickup() [2/2]

void game::pickup ( const tripoint p)
private

Definition at line 5577 of file game.cpp.

5578{
5579 // Highlight target
5580 shared_ptr_fast<game::draw_callback_t> hilite_cb = make_shared_fast<game::draw_callback_t>( [&]() {
5581 m.drawsq( w_terrain, p, drawsq_params().highlight( true ) );
5582 } );
5583 add_draw_callback( hilite_cb );
5584
5585 pickup::pick_up( p, 0 );
5586}

References add_draw_callback(), map::drawsq(), m, pickup::pick_up(), and w_terrain.

◆ pickup_feet()

void game::pickup_feet ( )
private

Definition at line 5588 of file game.cpp.

5589{
5590 pickup::pick_up( u.pos(), 1 );
5591}

References pickup::pick_up(), Character::pos(), and u.

Referenced by handle_action().

◆ place_critter_around() [1/2]

monster * game::place_critter_around ( const mtype_id id,
const tripoint center,
int  radius 
)

Definition at line 4622 of file game.cpp.

4623{
4624 // TODO: change this into an assert, it must never happen.
4625 if( id.is_null() ) {
4626 return nullptr;
4627 }
4628 return place_critter_around( make_shared_fast<monster>( id ), center, radius );
4629}
monster * place_critter_around(const mtype_id &id, const tripoint &center, int radius)
Definition: game.cpp:4622

References center, and place_critter_around().

Referenced by place_critter_around(), place_critter_at(), replace_stair_monsters(), and start_game().

◆ place_critter_around() [2/2]

monster * game::place_critter_around ( const shared_ptr_fast< monster > &  mon,
const tripoint center,
int  radius,
bool  forced = false 
)

Definition at line 4631 of file game.cpp.

4635{
4637 if( forced || can_place_monster( *mon, center ) ) {
4638 where = center;
4639 }
4640
4641 // This loop ensures the monster is placed as close to the center as possible,
4642 // but all places that equally far from the center have the same probability.
4643 for( int r = 1; r <= radius && !where; ++r ) {
4645 }
4646
4647 if( !where ) {
4648 return nullptr;
4649 }
4650 mon->spawn( *where );
4651 return critter_tracker->add( mon ) ? mon.get() : nullptr;
4652}
static cata::optional< tripoint > choose_where_to_place_monster(const monster &mon, const tripoint_range< tripoint > &range)
Definition: game.cpp:4604
static bool can_place_monster(const monster &mon, const tripoint &p)
Definition: game.cpp:4588

References can_place_monster(), center, choose_where_to_place_monster(), critter_tracker, m, and map::points_in_radius().

◆ place_critter_at() [1/2]

monster * game::place_critter_at ( const mtype_id id,
const tripoint p 
)

Adds critters to the reality bubble, creating them if necessary.

Functions taking a id parameter will construct a monster based on that id, (with default properties). Functions taking a mon parameter will use the supplied monster instance instead (which must not be null). Note: the monster will not be upgraded by these functions, it is placed as is.

place_critter_at will place the creature exactly at the given point.

place_critter_around will place the creature around the center p within the given radius (radius 0 means only the center point is used). The chosen point will be as close to the center as possible.

place_critter_within will place the creature at a random point within that given range. (All points within have equal probability.)

Returns
All functions return null if the creature could not be placed (usually because the target is not suitable for it: may be a solid wall, or air, or already occupied by some creature). If the creature has been placed, it returns a pointer to it (which is the same as the one contained in mon).

Definition at line 4612 of file game.cpp.

4613{
4614 return place_critter_around( id, p, 0 );
4615}

References place_critter_around().

Referenced by fungal_effects::fungalize(), revive_corpse(), fungal_effects::spread_fungus_one_tile(), and update_stair_monsters().

◆ place_critter_at() [2/2]

monster * game::place_critter_at ( const shared_ptr_fast< monster > &  mon,
const tripoint p 
)

Definition at line 4617 of file game.cpp.

4618{
4619 return place_critter_around( mon, p, 0 );
4620}

References place_critter_around().

◆ place_critter_within() [1/2]

monster * game::place_critter_within ( const mtype_id id,
const tripoint_range< tripoint > &  range 
)

Definition at line 4654 of file game.cpp.

4655{
4656 // TODO: change this into an assert, it must never happen.
4657 if( id.is_null() ) {
4658 return nullptr;
4659 }
4660 return place_critter_within( make_shared_fast<monster>( id ), range );
4661}
monster * place_critter_within(const mtype_id &id, const tripoint_range< tripoint > &range)
Definition: game.cpp:4654

References place_critter_within().

Referenced by place_critter_within().

◆ place_critter_within() [2/2]

monster * game::place_critter_within ( const shared_ptr_fast< monster > &  mon,
const tripoint_range< tripoint > &  range 
)

Definition at line 4663 of file game.cpp.

4665{
4666 const cata::optional<tripoint> where = choose_where_to_place_monster( *mon, range );
4667 if( !where ) {
4668 return nullptr;
4669 }
4670 mon->spawn( *where );
4671 return critter_tracker->add( mon ) ? mon.get() : nullptr;
4672}

References choose_where_to_place_monster(), and critter_tracker.

◆ place_player()

point game::place_player ( const tripoint dest)
Dexterity increases chance of avoiding cuts on sharp terrain

Definition at line 9041 of file game.cpp.

9042{
9043 const optional_vpart_position vp1 = m.veh_at( dest_loc );
9044 if( const cata::optional<std::string> label = vp1.get_label() ) {
9045 add_msg( m_info, _( "Label here: %s" ), *label );
9046 }
9047 std::string signage = m.get_signage( dest_loc );
9048 if( !signage.empty() ) {
9049 if( !u.has_trait( trait_ILLITERATE ) ) {
9050 add_msg( m_info, _( "The sign says: %s" ), signage );
9051 } else {
9052 add_msg( m_info, _( "There is a sign here, but you are unable to read it." ) );
9053 }
9054 }
9055 if( m.has_graffiti_at( dest_loc ) ) {
9056 if( !u.has_trait( trait_ILLITERATE ) ) {
9057 add_msg( m_info, _( "Written here: %s" ), m.graffiti_at( dest_loc ) );
9058 } else {
9059 add_msg( m_info, _( "Something is written here, but you are unable to read it." ) );
9060 }
9061 }
9062 // TODO: Move the stuff below to a Character method so that NPCs can reuse it
9063 if( m.has_flag( "ROUGH", dest_loc ) && ( !u.in_vehicle ) && ( !u.is_mounted() ) ) {
9064 if( one_in( 5 ) && u.get_armor_bash( bodypart_id( "foot_l" ) ) < rng( 2, 5 ) ) {
9065 add_msg( m_bad, _( "You hurt your left foot on the %s!" ),
9066 m.has_flag_ter( "ROUGH", dest_loc ) ? m.tername( dest_loc ) : m.furnname(
9067 dest_loc ) );
9068 u.deal_damage( nullptr, bodypart_id( "foot_l" ), damage_instance( DT_CUT, 1 ) );
9069 }
9070 if( one_in( 5 ) && u.get_armor_bash( bodypart_id( "foot_r" ) ) < rng( 2, 5 ) ) {
9071 add_msg( m_bad, _( "You hurt your right foot on the %s!" ),
9072 m.has_flag_ter( "ROUGH", dest_loc ) ? m.tername( dest_loc ) : m.furnname(
9073 dest_loc ) );
9074 u.deal_damage( nullptr, bodypart_id( "foot_l" ), damage_instance( DT_CUT, 1 ) );
9075 }
9076 }
9077 ///\EFFECT_DEX increases chance of avoiding cuts on sharp terrain
9078 if( m.has_flag( "SHARP", dest_loc ) && !one_in( 3 ) && !x_in_y( 1 + u.dex_cur / 2.0, 40 ) &&
9079 ( !u.in_vehicle && !m.veh_at( dest_loc ) ) && ( !u.has_trait( trait_PARKOUR ) ||
9080 one_in( 4 ) ) && ( u.has_trait( trait_THICKSKIN ) ? !one_in( 8 ) : true ) ) {
9081 if( u.is_mounted() ) {
9082 add_msg( _( "Your %s gets cut!" ), u.mounted_creature->get_name() );
9083 u.mounted_creature->apply_damage( nullptr, bodypart_id( "torso" ), rng( 1, 10 ) );
9084 } else {
9085 const bodypart_id bp = u.get_random_body_part();
9086 if( u.deal_damage( nullptr, bp, damage_instance( DT_CUT, rng( 1, 10 ) ) ).total_damage() > 0 ) {
9087 //~ 1$s - bodypart name in accusative, 2$s is terrain name.
9088 add_msg( m_bad, _( "You cut your %1$s on the %2$s!" ),
9089 body_part_name_accusative( bp->token ),
9090 m.has_flag_ter( "SHARP", dest_loc ) ? m.tername( dest_loc ) : m.furnname(
9091 dest_loc ) );
9092 }
9093 }
9094 }
9095 if( m.has_flag( "UNSTABLE", dest_loc ) && !u.is_mounted() ) {
9096 u.add_effect( effect_bouldering, 1_turns, num_bp );
9097 } else if( u.has_effect( effect_bouldering ) ) {
9099 }
9100 if( m.has_flag_ter_or_furn( TFLAG_NO_SIGHT, dest_loc ) ) {
9101 u.add_effect( effect_no_sight, 1_turns, num_bp );
9102 } else if( u.has_effect( effect_no_sight ) ) {
9104 }
9105
9106 // If we moved out of the nonant, we need update our map data
9107 if( m.has_flag( "SWIMMABLE", dest_loc ) && u.has_effect( effect_onfire ) ) {
9108 add_msg( _( "The water puts out the flames!" ) );
9110 if( u.is_mounted() ) {
9111 monster *mon = u.mounted_creature.get();
9112 if( mon->has_effect( effect_onfire ) ) {
9114 }
9115 }
9116 }
9117
9118 if( monster *const mon_ptr = critter_at<monster>( dest_loc ) ) {
9119 // We displaced a monster. It's probably a bug if it wasn't a friendly mon...
9120 // Immobile monsters can't be displaced.
9121 monster &critter = *mon_ptr;
9122 // TODO: handling for ridden creatures other than players mount.
9123 if( !critter.has_effect( effect_ridden ) ) {
9124 if( u.is_mounted() ) {
9125 std::vector<tripoint> valid;
9126 for( const tripoint &jk : m.points_in_radius( critter.pos(), 1 ) ) {
9127 if( is_empty( jk ) ) {
9128 valid.push_back( jk );
9129 }
9130 }
9131 if( !valid.empty() ) {
9132 critter.move_to( random_entry( valid ) );
9133 add_msg( _( "You push the %s out of the way." ), critter.name() );
9134 } else {
9135 add_msg( _( "There is no room to push the %s out of the way." ), critter.name() );
9136 return u.pos().xy();
9137 }
9138 } else {
9139 critter.move_to( u.pos(), false,
9140 true ); // Force the movement even though the player is there right now.
9141 add_msg( _( "You displace the %s." ), critter.name() );
9142 }
9143 } else if( !u.has_effect( effect_riding ) ) {
9144 add_msg( _( "You cannot move the %s out of the way." ), critter.name() );
9145 return u.pos().xy();
9146 }
9147 }
9148
9149 // If the player is in a vehicle, unboard them from the current part
9150 if( u.in_vehicle ) {
9151 m.unboard_vehicle( u.pos() );
9152 }
9153 // Move the player
9154 // Start with z-level, to make it less likely that old functions (2D ones) freak out
9155 if( m.has_zlevels() && dest_loc.z != get_levz() ) {
9156 vertical_shift( dest_loc.z );
9157 }
9158
9159 if( u.is_hauling() && ( !m.can_put_items( dest_loc ) ||
9160 m.has_flag( TFLAG_DEEP_WATER, dest_loc ) ||
9161 vp1 ) ) {
9162 u.stop_hauling();
9163 }
9164 u.setpos( dest_loc );
9165 if( u.is_mounted() ) {
9166 monster *mon = u.mounted_creature.get();
9167 mon->setpos( dest_loc );
9168 mon->process_triggers();
9169 m.creature_in_field( *mon );
9170 }
9171 point submap_shift = update_map( u );
9172 // Important: don't use dest_loc after this line. `update_map` may have shifted the map
9173 // and dest_loc was not adjusted and therefore is still in the un-shifted system and probably wrong.
9174 // If you must use it you can calculate the position in the new, shifted system with
9175 // adjusted_pos = ( old_pos.x - submap_shift.x * SEEX, old_pos.y - submap_shift.y * SEEY, old_pos.z )
9176
9177 //Auto pulp or butcher and Auto foraging
9178 if( get_option<bool>( "AUTO_FEATURES" ) && mostseen == 0 && !u.is_mounted() ) {
9180
9181 const std::string forage_type = get_option<std::string>( "AUTO_FORAGING" );
9182 if( forage_type != "off" ) {
9183 const auto forage = [&]( const tripoint & pos ) {
9184 const auto &xter_t = m.ter( pos ).obj().examine;
9185 const auto &xfurn_t = m.furn( pos ).obj().examine;
9186 const bool forage_everything = forage_type == "both";
9187 const bool forage_bushes = forage_everything || forage_type == "bushes";
9188 const bool forage_trees = forage_everything || forage_type == "trees";
9189 if( xter_t == &iexamine::none ) {
9190 return;
9191 } else if( ( forage_bushes && xter_t == &iexamine::shrub_marloss ) ||
9192 ( forage_bushes && xter_t == &iexamine::shrub_wildveggies ) ||
9193 ( forage_bushes && xter_t == &iexamine::harvest_ter_nectar ) ||
9194 ( forage_trees && xter_t == &iexamine::tree_marloss ) ||
9195 ( forage_trees && xter_t == &iexamine::harvest_ter ) ||
9196 ( forage_trees && xter_t == &iexamine::harvest_ter_nectar )
9197 ) {
9198 xter_t( u, pos );
9199 } else if( ( forage_everything && xfurn_t == &iexamine::harvest_furn ) ||
9200 ( forage_everything && xfurn_t == &iexamine::harvest_furn_nectar )
9201 ) {
9202 xfurn_t( u, pos );
9203 }
9204 };
9205
9206 for( auto &elem : adjacentDir ) {
9207 forage( u.pos() + direction_XY( elem ) );
9208 }
9209 }
9210
9211 const std::string pulp_butcher = get_option<std::string>( "AUTO_PULP_BUTCHER" );
9212 if( pulp_butcher == "butcher" && u.max_quality( quality_id( "BUTCHER" ) ) > INT_MIN ) {
9213 std::vector<item *> corpses;
9214
9215 for( item &it : m.i_at( u.pos() ) ) {
9216 corpses.push_back( &it );
9217 }
9218
9219 if( !corpses.empty() ) {
9220 u.assign_activity( activity_id( "ACT_BUTCHER" ), 0, true );
9221 for( item *it : corpses ) {
9222 u.activity.targets.emplace_back( map_cursor( u.pos() ), it );
9223 }
9224 }
9225 } else if( pulp_butcher == "pulp" || pulp_butcher == "pulp_adjacent" ) {
9226 const auto pulp = [&]( const tripoint & pos ) {
9227 for( const auto &maybe_corpse : m.i_at( pos ) ) {
9228 if( maybe_corpse.is_corpse() && maybe_corpse.can_revive() &&
9229 !maybe_corpse.get_mtype()->bloodType().obj().has_acid ) {
9231 u.activity.placement = m.getabs( pos );
9232 u.activity.auto_resume = true;
9233 u.activity.str_values.push_back( "auto_pulp_no_acid" );
9234 return;
9235 }
9236 }
9237 };
9238
9239 if( pulp_butcher == "pulp_adjacent" ) {
9240 for( auto &elem : adjacentDir ) {
9241 pulp( u.pos() + direction_XY( elem ) );
9242 }
9243 } else {
9244 pulp( u.pos() );
9245 }
9246 }
9247 }
9248
9249 //Autopickup
9250 if( !u.is_mounted() && get_option<bool>( "AUTO_PICKUP" ) && !u.is_hauling() &&
9251 ( !get_option<bool>( "AUTO_PICKUP_SAFEMODE" ) || mostseen == 0 ) &&
9252 ( m.has_items( u.pos() ) || get_option<bool>( "AUTO_PICKUP_ADJACENT" ) ) ) {
9253 pickup::pick_up( u.pos(), -1 );
9254 }
9255
9256 // If the new tile is a boardable part, board it
9257 if( vp1.part_with_feature( "BOARDABLE", true ) && !u.is_mounted() ) {
9258 m.board_vehicle( u.pos(), &u );
9259 }
9260
9261 // Traps!
9262 // Try to detect.
9264 if( u.is_mounted() ) {
9266 } else {
9267 m.creature_on_trap( u );
9268 }
9269 // Drench the player if swimmable
9270 if( m.has_flag( "SWIMMABLE", u.pos() ) &&
9271 !( u.is_mounted() || ( u.in_vehicle && vp1->vehicle().can_float() ) ) ) {
9272 u.drench( 40, { { bp_foot_l, bp_foot_r, bp_leg_l, bp_leg_r } }, false );
9273 }
9274
9275 // List items here
9276 if( !m.has_flag( "SEALED", u.pos() ) ) {
9277 if( get_option<bool>( "NO_AUTO_PICKUP_ZONES_LIST_ITEMS" ) ||
9278 !check_zone( zone_type_id( "NO_AUTO_PICKUP" ), u.pos() ) ) {
9279 if( u.is_blind() && !m.i_at( u.pos() ).empty() ) {
9280 add_msg( _( "There's something here, but you can't see what it is." ) );
9281 } else if( m.has_items( u.pos() ) ) {
9282 std::vector<std::string> names;
9283 std::vector<size_t> counts;
9284 std::vector<item> items;
9285 for( auto &tmpitem : m.i_at( u.pos() ) ) {
9286
9287 std::string next_tname = tmpitem.tname();
9288 std::string next_dname = tmpitem.display_name();
9289 bool by_charges = tmpitem.count_by_charges();
9290 bool got_it = false;
9291 for( size_t i = 0; i < names.size(); ++i ) {
9292 if( by_charges && next_tname == names[i] ) {
9293 counts[i] += tmpitem.charges;
9294 got_it = true;
9295 break;
9296 } else if( next_dname == names[i] ) {
9297 counts[i] += 1;
9298 got_it = true;
9299 break;
9300 }
9301 }
9302 if( !got_it ) {
9303 if( by_charges ) {
9304 names.push_back( tmpitem.tname( tmpitem.charges ) );
9305 counts.push_back( tmpitem.charges );
9306 } else {
9307 names.push_back( tmpitem.display_name( 1 ) );
9308 counts.push_back( 1 );
9309 }
9310 items.push_back( tmpitem );
9311 }
9312 if( names.size() > 10 ) {
9313 break;
9314 }
9315 }
9316 for( size_t i = 0; i < names.size(); ++i ) {
9317 if( !items[i].count_by_charges() ) {
9318 names[i] = items[i].display_name( counts[i] );
9319 } else {
9320 names[i] = items[i].tname( counts[i] );
9321 }
9322 }
9323 int and_the_rest = 0;
9324 for( size_t i = 0; i < names.size(); ++i ) {
9325 //~ number of items: "<number> <item>"
9326 std::string fmt = vgettext( "%1$d %2$s", "%1$d %2$s", counts[i] );
9327 names[i] = string_format( fmt, counts[i], names[i] );
9328 // Skip the first two.
9329 if( i > 1 ) {
9330 and_the_rest += counts[i];
9331 }
9332 }
9333 if( names.size() == 1 ) {
9334 add_msg( _( "You see here %s." ), names[0] );
9335 } else if( names.size() == 2 ) {
9336 add_msg( _( "You see here %s and %s." ), names[0], names[1] );
9337 } else if( names.size() == 3 ) {
9338 add_msg( _( "You see here %s, %s, and %s." ), names[0], names[1], names[2] );
9339 } else if( and_the_rest < 7 ) {
9340 add_msg( vgettext( "You see here %s, %s and %d more item.",
9341 "You see here %s, %s and %d more items.",
9342 and_the_rest ),
9343 names[0], names[1], and_the_rest );
9344 } else {
9345 add_msg( _( "You see here %s and many more items." ), names[0] );
9346 }
9347 }
9348 }
9349 }
9350
9351 if( ( vp1.part_with_feature( "CONTROL_ANIMAL", true ) ||
9352 vp1.part_with_feature( "CONTROLS", true ) ) && u.in_vehicle && !u.is_mounted() ) {
9353 add_msg( _( "There are vehicle controls here." ) );
9354 if( !u.has_trait( trait_id( "WAYFARER" ) ) ) {
9355 add_msg( m_info, _( "%s to drive." ), press_x( ACTION_CONTROL_VEHICLE ) );
9356 }
9357 } else if( vp1.part_with_feature( "CONTROLS", true ) && u.in_vehicle &&
9358 u.is_mounted() ) {
9359 add_msg( _( "There are vehicle controls here but you cannot reach them whilst mounted." ) );
9360 }
9361 return submap_shift;
9362}
std::string body_part_name_accusative(body_part bp, int number)
Returns the matching accusative name of the body_part token, i.e.
Definition: bodypart.cpp:329
void drench(int saturation, const body_part_set &flags, bool ignore_waterproof)
Drenches the player with water, saturation is the percent gotten wet.
Definition: suffer.cpp:1757
bool is_hauling() const
Definition: character.cpp:9094
void stop_hauling()
Definition: character.cpp:9085
bodypart_id get_random_body_part(bool main=false) const
Definition: creature.cpp:1625
void vertical_shift(int z_after)
Actual z-level movement part of vertical_move.
Definition: game.cpp:10525
bool check_zone(const zone_type_id &type, const tripoint &where) const
Definition: game.cpp:5978
std::string furnname(const tripoint &p)
Definition: map.cpp:1469
bool has_flag_ter_or_furn(const std::string &flag, const tripoint &p) const
Definition: map.cpp:2322
bool has_graffiti_at(const tripoint &p) const
Definition: map.cpp:7848
bool has_items(const tripoint &p) const
Checks for existence of items.
Definition: map.cpp:4771
const std::string & graffiti_at(const tripoint &p) const
Definition: map.cpp:7837
bool has_flag_ter(const std::string &flag, const tripoint &p) const
Definition: map.cpp:2312
bool can_put_items(const tripoint &p) const
Definition: map.cpp:2298
void setpos(const tripoint &p) override
Definition: monster.cpp:238
bool move_to(const tripoint &p, bool force=false, bool step_on_critter=false, float stagger_adjustment=1.0)
Attempt to move to p.
Definition: monmove.cpp:1548
void process_triggers()
Definition: monster.cpp:1212
cata::optional< std::string > get_label() const
std::vector< std::string > str_values
bool auto_resume
If true, the activity will be auto-resumed next time the player attempts an identical activity.
static const efftype_id effect_riding("riding")
static const trait_id trait_ILLITERATE("ILLITERATE")
static const efftype_id effect_bouldering("bouldering")
static const trait_id trait_PARKOUR("PARKOUR")
static const efftype_id effect_no_sight("no_sight")
static const trait_id trait_THICKSKIN("THICKSKIN")
static const efftype_id effect_onfire("onfire")
point direction_XY(const direction dir)
Definition: line.cpp:433
@ TFLAG_NO_SIGHT
Definition: mapdata.h:283
@ TFLAG_DEEP_WATER
Definition: mapdata.h:301
static std::map< nameFlags, std::vector< std::string > > names
Definition: name.cpp:18
const int INDEFINITELY_LONG
A number that represents the longest possible action.
void search_surroundings(Character &who)
Search surrounding squares for traps (and maybe other things in the future).
void shrub_wildveggies(player &p, const tripoint &examp)
Definition: iexamine.cpp:3680
void shrub_marloss(player &p, const tripoint &examp)
Definition: iexamine.cpp:3645
void harvest_ter(player &p, const tripoint &examp)
Definition: iexamine.cpp:2117
void harvest_furn(player &p, const tripoint &examp)
Definition: iexamine.cpp:2096
void harvest_ter_nectar(player &p, const tripoint &examp)
Definition: iexamine.cpp:2105
void harvest_furn_nectar(player &p, const tripoint &examp)
Definition: iexamine.cpp:2087
void tree_marloss(player &p, const tripoint &examp)
Definition: iexamine.cpp:3659
string_id< zone_type > zone_type_id
Definition: type_id.h:199

References _, ACTION_CONTROL_VEHICLE, Character::activity, Creature::add_effect(), add_msg(), Character::assign_activity(), player_activity::auto_resume, map::board_vehicle(), body_part_name_accusative(), bp_foot_l, bp_foot_r, bp_leg_l, bp_leg_r, map::can_put_items(), check_zone(), map::creature_in_field(), map::creature_on_trap(), Character::deal_damage(), Character::dex_cur, direction_XY(), Character::drench(), DT_CUT, EAST, effect_bouldering, effect_no_sight, effect_onfire, effect_ridden, effect_riding, item_stack::empty(), map_data_common_t::examine, map::furn(), map::furnname(), Character::get_armor_bash(), optional_vpart_position::get_label(), get_levz(), Creature::get_random_body_part(), map::get_signage(), map::getabs(), map::graffiti_at(), iexamine::harvest_furn(), iexamine::harvest_furn_nectar(), iexamine::harvest_ter(), iexamine::harvest_ter_nectar(), Creature::has_effect(), map::has_flag(), map::has_flag_ter(), map::has_flag_ter_or_furn(), map::has_graffiti_at(), map::has_items(), Character::has_trait(), map::has_zlevels(), map::i_at(), Character::in_vehicle, calendar::INDEFINITELY_LONG, Character::is_blind(), is_empty(), Character::is_hauling(), Character::is_mounted(), m, m_bad, m_info, visitable< T >::max_quality(), mostseen, Character::mounted_creature, monster::move_to(), monster::name(), Name::names, iexamine::none(), NORTH, NORTHEAST, NORTHWEST, num_bp, int_id< T >::obj(), one_in(), optional_vpart_position::part_with_feature(), pickup::pick_up(), player_activity::placement, map::points_in_radius(), Character::pos(), monster::pos(), press_x(), monster::process_triggers(), random_entry(), Creature::remove_effect(), rng(), character_funcs::search_surroundings(), Character::setpos(), monster::setpos(), iexamine::shrub_marloss(), iexamine::shrub_wildveggies(), SOUTH, SOUTHEAST, SOUTHWEST, Character::stop_hauling(), player_activity::str_values, string_format(), player_activity::targets, map::ter(), map::tername(), TFLAG_DEEP_WATER, TFLAG_NO_SIGHT, trait_ILLITERATE, trait_PARKOUR, trait_THICKSKIN, iexamine::tree_marloss(), u, map::unboard_vehicle(), update_map(), map::veh_at(), vertical_shift(), vgettext(), WEST, x_in_y(), tripoint::xy(), and tripoint::z.

Referenced by place_player_overmap(), and walk_move().

◆ place_player_overmap()

void game::place_player_overmap ( const tripoint_abs_omt om_dest)

Definition at line 9364 of file game.cpp.

9365{
9366 // if player is teleporting around, they don't bring their horse with them
9367 if( u.is_mounted() ) {
9369 u.mounted_creature->remove_effect( effect_ridden );
9370 u.mounted_creature = nullptr;
9371 }
9372 // offload the active npcs.
9373 unload_npcs();
9374 for( monster &critter : all_monsters() ) {
9375 despawn_monster( critter );
9376 }
9377 if( u.in_vehicle ) {
9378 m.unboard_vehicle( u.pos() );
9379 }
9380
9382 const int minz = m.has_zlevels() ? -OVERMAP_DEPTH : get_levz();
9383 const int maxz = m.has_zlevels() ? OVERMAP_HEIGHT : get_levz();
9384 for( int z = minz; z <= maxz; z++ ) {
9385 m.clear_vehicle_list( z );
9386 }
9388 // offset because load_map expects the coordinates of the top left corner, but the
9389 // player will be centered in the middle of the map.
9390 // TODO: fix point types
9391 const tripoint map_sm_pos(
9392 project_to<coords::sm>( om_dest ).raw() + point( -HALF_MAPSIZE, -HALF_MAPSIZE ) );
9393 const tripoint player_pos( u.pos().xy(), map_sm_pos.z );
9394 load_map( map_sm_pos );
9395 load_npcs();
9396 m.spawn_monsters( true ); // Static monsters
9398 // update weather now as it could be different on the new location
9400 place_player( player_pos );
9401}
point place_player(const tripoint &dest)
Definition: game.cpp:9041
void unload_npcs()
Unloads all NPCs.
Definition: game.cpp:855
void update_overmap_seen()
Definition: game.cpp:10703
level_cache & access_cache(int zlev)
Definition: map.cpp:8747
void clear_vehicle_list(int zlev)
Definition: map.cpp:331
void clear_vehicle_cache()
Definition: map.cpp:313
std::bitset< MAPSIZE_X *MAPSIZE_Y > map_memory_seen_cache
Definition: map.h:351

References map::access_cache(), all_monsters(), map::clear_vehicle_cache(), map::clear_vehicle_list(), despawn_monster(), effect_ridden, effect_riding, get_levz(), get_weather, HALF_MAPSIZE, map::has_zlevels(), Character::in_vehicle, Character::is_mounted(), load_map(), load_npcs(), m, level_cache::map_memory_seen_cache, Character::mounted_creature, weather_manager::nextweather, OVERMAP_DEPTH, OVERMAP_HEIGHT, place_player(), Character::pos(), Creature::remove_effect(), map::spawn_monsters(), calendar::turn, u, map::unboard_vehicle(), unload_npcs(), update_overmap_seen(), tripoint::xy(), and tripoint::z.

◆ place_vehicle_nearby()

vehicle * game::place_vehicle_nearby ( const vproto_id id,
const point_abs_omt origin,
int  min_distance,
int  max_distance,
const std::vector< std::string > &  omt_search_types = {} 
)
private

Definition at line 751 of file game.cpp.

754{
755 std::vector<std::string> search_types = omt_search_types;
756 if( search_types.empty() ) {
757 vehicle veh( id );
758 if( veh.can_float() ) {
759 search_types.push_back( "river" );
760 search_types.push_back( "lake" );
761 } else {
762 search_types.push_back( "field" );
763 search_types.push_back( "road" );
764 }
765 }
766 for( const std::string &search_type : search_types ) {
767 omt_find_params find_params;
768 find_params.must_see = false;
769 find_params.cant_see = false;
770 find_params.types.emplace_back( search_type, ot_match_type::type );
771 // find nearest road
772 find_params.min_distance = min_distance;
773 find_params.search_range = max_distance;
774 // if player spawns underground, park their car on the surface.
775 const tripoint_abs_omt omt_origin( origin, 0 );
776 for( const tripoint_abs_omt &goal : overmap_buffer.find_all( omt_origin, find_params ) ) {
777 // try place vehicle there.
778 tinymap target_map;
779 target_map.load( project_to<coords::sm>( goal ), false );
780 const tripoint tinymap_center( SEEX, SEEY, goal.z() );
781 static constexpr std::array<units::angle, 4> angles = {{
782 0_degrees, 90_degrees, 180_degrees, 270_degrees
783 }
784 };
785 vehicle *veh = target_map.add_vehicle(
786 id, tinymap_center, random_entry( angles ), rng( 50, 80 ), 0, false );
787 if( veh ) {
788 tripoint abs_local = m.getlocal( target_map.getabs( tinymap_center ) );
789 veh->sm_pos = ms_to_sm_remain( abs_local );
790 veh->pos = abs_local.xy();
792 veh->tracking_on = true;
793 target_map.save();
794 return veh;
795 }
796 }
797 }
798 return nullptr;
799}
void save()
Add currently loaded submaps (in grid) to the mapbuffer.
Definition: map.cpp:6609
vehicle * add_vehicle(const vgroup_id &type, const tripoint &p, units::angle dir, int init_veh_fuel=-1, int init_veh_status=-1, bool merge_wrecks=true)
Definition: mapgen.cpp:5631
void add_vehicle(vehicle *veh)
Add the vehicle to be tracked in the overmap.
std::vector< tripoint_abs_omt > find_all(const tripoint_abs_omt &origin, const omt_find_params &params)
Find all places with the specific overmap terrain type.
Definition: map.h:2108
point pos
Position of the vehicle inside the submap that contains the vehicle.
Definition: vehicle.h:1916
tripoint sm_pos
Submap coordinates of the currently loaded submap (see game::m) that contains this vehicle.
Definition: vehicle.h:1901
bool tracking_on
Definition: vehicle.h:1991
point ms_to_sm_remain(int &x, int &y)
static constexpr int SEEY
Standard arguments for finding overmap terrain.
std::vector< std::pair< std::string, ot_match_type > > types

References map::add_vehicle(), overmapbuffer::add_vehicle(), vehicle::can_float(), omt_find_params::cant_see, overmapbuffer::find_all(), map::getabs(), map::getlocal(), map::load(), m, omt_find_params::min_distance, ms_to_sm_remain(), omt_find_params::must_see, overmap_buffer, vehicle::pos, random_entry(), rng(), map::save(), omt_find_params::search_range, SEEX, SEEY, vehicle::sm_pos, vehicle::tracking_on, type, omt_find_params::types, and tripoint::xy().

Referenced by start_game().

◆ pre_print_all_tile_info()

void game::pre_print_all_tile_info ( const tripoint lp,
const catacurses::window w_info,
int &  line,
int  last_line,
const visibility_variables cache 
)

Definition at line 6520 of file game.cpp.

6523{
6524 // get global area info according to look_around caret position
6525 // TODO: fix point types
6527 lp ) ) ) );
6528 // we only need the area name and then pass it to print_all_tile_info() function below
6529 const std::string area_name = cur_ter_m->get_name();
6530 print_all_tile_info( lp, w_info, area_name, 1, first_line, last_line, cache );
6531}
void print_all_tile_info(const tripoint &lp, const catacurses::window &w_look, const std::string &area_name, int column, int &line, int last_line, const visibility_variables &cache)
Definition: game.cpp:5698
point ms_to_omt_copy(const point &p)
coords::coord_point< tripoint, coords::origin::abs, coords::omt > tripoint_abs_omt
Definition: coordinates.h:493
std::string get_name() const
Definition: omdata.h:205

References oter_t::get_name(), map::getabs(), m, ms_to_omt_copy(), overmap_buffer, print_all_tile_info(), and overmapbuffer::ter().

Referenced by look_around().

◆ print_all_tile_info()

void game::print_all_tile_info ( const tripoint lp,
const catacurses::window w_look,
const std::string &  area_name,
int  column,
int &  line,
int  last_line,
const visibility_variables cache 
)

Definition at line 5698 of file game.cpp.

5703{
5704 visibility_type visibility = VIS_HIDDEN;
5705 const bool inbounds = m.inbounds( lp );
5706 if( inbounds ) {
5707 visibility = m.get_visibility( m.apparent_light_at( lp, cache ), cache );
5708 }
5709 const Creature *creature = critter_at( lp, true );
5710 switch( visibility ) {
5711 case VIS_CLEAR: {
5712 const optional_vpart_position vp = m.veh_at( lp );
5713 print_terrain_info( lp, w_look, area_name, column, line );
5714 print_fields_info( lp, w_look, column, line );
5715 print_trap_info( lp, w_look, column, line );
5716 print_creature_info( creature, w_look, column, line, last_line );
5717 print_vehicle_info( veh_pointer_or_null( vp ), vp ? vp->part_index() : -1, w_look, column, line,
5718 last_line );
5719 print_items_info( lp, w_look, column, line, last_line );
5720 print_graffiti_info( lp, w_look, column, line, last_line );
5721 }
5722 break;
5723 case VIS_BOOMER:
5724 case VIS_BOOMER_DARK:
5725 case VIS_DARK:
5726 case VIS_LIT:
5727 case VIS_HIDDEN:
5728 print_visibility_info( w_look, column, line, visibility );
5729
5730 if( creature != nullptr ) {
5731 std::vector<std::string> buf;
5732 if( u.sees_with_infrared( *creature ) ) {
5733 creature->describe_infrared( buf );
5734 } else if( u.sees_with_specials( *creature ) ) {
5735 creature->describe_specials( buf );
5736 }
5737 for( const std::string &s : buf ) {
5738 mvwprintw( w_look, point( 1, ++line ), s );
5739 }
5740 }
5741 break;
5742 }
5743 if( !inbounds ) {
5744 return;
5745 }
5746 auto this_sound = sounds::sound_at( lp );
5747 if( !this_sound.empty() ) {
5748 mvwprintw( w_look, point( 1, ++line ), _( "You heard %s from here." ), this_sound );
5749 } else {
5750 // Check other z-levels
5751 tripoint tmp = lp;
5752 for( tmp.z = -OVERMAP_DEPTH; tmp.z <= OVERMAP_HEIGHT; tmp.z++ ) {
5753 if( tmp.z == lp.z ) {
5754 continue;
5755 }
5756
5757 auto zlev_sound = sounds::sound_at( tmp );
5758 if( !zlev_sound.empty() ) {
5759 mvwprintw( w_look, point( 1, ++line ), tmp.z > lp.z ?
5760 _( "You heard %s from above." ) : _( "You heard %s from below." ), zlev_sound );
5761 }
5762 }
5763 }
5764}
bool sees_with_specials(const Creature &critter) const
Definition: character.cpp:6337
bool sees_with_infrared(const Creature &critter) const
Check whether the this player can see the other creature with infrared.
void print_fields_info(const tripoint &lp, const catacurses::window &w_look, int column, int &line)
Definition: game.cpp:5868
void print_terrain_info(const tripoint &lp, const catacurses::window &w_look, const std::string &area_name, int column, int &line)
Definition: game.cpp:5795
void print_graffiti_info(const tripoint &lp, const catacurses::window &w_look, int column, int &line, int last_line)
Definition: game.cpp:5962
void print_creature_info(const Creature *creature, const catacurses::window &w_look, int column, int &line, int last_line)
Definition: game.cpp:5906
void print_vehicle_info(const vehicle *veh, int veh_part, const catacurses::window &w_look, int column, int &line, int last_line)
Definition: game.cpp:5915
void print_items_info(const tripoint &lp, const catacurses::window &w_look, int column, int &line, int last_line)
Definition: game.cpp:5924
void print_visibility_info(const catacurses::window &w_look, int column, int &line, visibility_type visibility)
Definition: game.cpp:5766
void print_trap_info(const tripoint &lp, const catacurses::window &w_look, int column, int &line)
Definition: game.cpp:5886
void line(map *m, const ter_id &type, const point &p1, const point &p2)
Definition: mapgen.cpp:6486
std::string sound_at(const tripoint &location)
Definition: sounds.cpp:605

References _, map::apparent_light_at(), creature, critter_at(), map::get_visibility(), map::inbounds(), line(), m, catacurses::mvwprintw(), OVERMAP_DEPTH, OVERMAP_HEIGHT, print_creature_info(), print_fields_info(), print_graffiti_info(), print_items_info(), print_terrain_info(), print_trap_info(), print_vehicle_info(), print_visibility_info(), Character::sees_with_infrared(), Character::sees_with_specials(), sounds::sound_at(), u, map::veh_at(), veh_pointer_or_null(), VIS_BOOMER, VIS_BOOMER_DARK, VIS_CLEAR, VIS_DARK, VIS_HIDDEN, VIS_LIT, and tripoint::z.

Referenced by pre_print_all_tile_info().

◆ print_creature_info()

void game::print_creature_info ( const Creature creature,
const catacurses::window w_look,
int  column,
int &  line,
int  last_line 
)
private

Definition at line 5906 of file game.cpp.

5908{
5909 int vLines = last_line - line;
5910 if( creature != nullptr && ( u.sees( *creature ) || creature == &u ) ) {
5911 line = creature->print_info( w_look, ++line, vLines, column );
5912 }
5913}

References creature, line(), Character::sees(), and u.

Referenced by print_all_tile_info().

◆ print_fields_info()

void game::print_fields_info ( const tripoint lp,
const catacurses::window w_look,
int  column,
int &  line 
)
private

Definition at line 5868 of file game.cpp.

5870{
5871 const field &tmpfield = m.field_at( lp );
5872 for( auto &fld : tmpfield ) {
5873 const field_entry &cur = fld.second;
5874 if( fld.first.obj().has_fire && ( m.has_flag( TFLAG_FIRE_CONTAINER, lp ) ||
5875 m.ter( lp ) == t_pit_shallow || m.ter( lp ) == t_pit ) ) {
5876 const int max_width = getmaxx( w_look ) - column - 2;
5877 int lines = fold_and_print( w_look, point( column, ++line ), max_width, cur.color(),
5878 get_fire_fuel_string( lp ) ) - 1;
5879 line += lines;
5880 } else {
5881 mvwprintz( w_look, point( column, ++line ), cur.color(), cur.name() );
5882 }
5883 }
5884}
An active or passive effect existing on a tile.
Definition: field.h:20
nc_color color() const
Definition: field.cpp:94
std::string name() const
Definition: field.h:84
A variable sized collection of field entries on a given map square.
Definition: field.h:131
ter_id t_pit_shallow
Definition: mapdata.cpp:627
ter_id t_pit
Definition: mapdata.cpp:627

References field_entry::color(), map::field_at(), fold_and_print(), get_fire_fuel_string(), catacurses::getmaxx(), map::has_flag(), line(), m, mvwprintz(), field_entry::name(), t_pit, t_pit_shallow, map::ter(), and TFLAG_FIRE_CONTAINER.

Referenced by print_all_tile_info().

◆ print_graffiti_info()

void game::print_graffiti_info ( const tripoint lp,
const catacurses::window w_look,
int  column,
int &  line,
int  last_line 
)
private

Definition at line 5962 of file game.cpp.

5965{
5966 if( line > last_line ) {
5967 return;
5968 }
5969
5970 const int max_width = getmaxx( w_look ) - column - 2;
5971 if( m.has_graffiti_at( lp ) ) {
5972 fold_and_print( w_look, point( column, ++line ), max_width, c_light_gray,
5973 m.ter( lp ) == t_grave_new ? _( "Graffiti: %s" ) : _( "Inscription: %s" ),
5974 m.graffiti_at( lp ) );
5975 }
5976}
ter_id t_grave_new
Definition: mapdata.cpp:627

References _, c_light_gray, fold_and_print(), catacurses::getmaxx(), map::graffiti_at(), map::has_graffiti_at(), line(), m, t_grave_new, and map::ter().

Referenced by print_all_tile_info().

◆ print_items_info()

void game::print_items_info ( const tripoint lp,
const catacurses::window w_look,
int  column,
int &  line,
int  last_line 
)
private

Definition at line 5924 of file game.cpp.

5928{
5929 if( !m.sees_some_items( lp, u ) ) {
5930 return;
5931 } else if( m.has_flag( "CONTAINER", lp ) && !m.could_see_items( lp, u ) ) {
5932 mvwprintw( w_look, point( column, ++line ), _( "You cannot see what is inside of it." ) );
5933 } else if( u.has_effect( effect_blind ) || u.worn_with_flag( "BLIND" ) ) {
5934 mvwprintz( w_look, point( column, ++line ), c_yellow,
5935 _( "There's something there, but you can't see what it is." ) );
5936 return;
5937 } else {
5938 std::map<std::string, int> item_names;
5939 for( auto &item : m.i_at( lp ) ) {
5940 ++item_names[item.tname()];
5941 }
5942
5943 const int max_width = getmaxx( w_look ) - column - 1;
5944 for( auto it = item_names.begin(); it != item_names.end(); ++it ) {
5945 // last line but not last item
5946 if( line + 1 >= last_line && std::next( it ) != item_names.end() ) {
5947 mvwprintz( w_look, point( column, ++line ), c_yellow, _( "More items here…" ) );
5948 break;
5949 }
5950
5951 if( it->second > 1 ) {
5952 trim_and_print( w_look, point( column, ++line ), max_width, c_white,
5953 pgettext( "%s is the name of the item. %d is the quantity of that item.", "%s [%d]" ),
5954 it->first.c_str(), it->second );
5955 } else {
5956 trim_and_print( w_look, point( column, ++line ), max_width, c_white, it->first );
5957 }
5958 }
5959 }
5960}
bool could_see_items(const tripoint &p, const Creature &who) const
Check if the creature could see items at p if there were any items.
Definition: map.cpp:4747
static const efftype_id effect_blind("blind")

References _, c_white, c_yellow, map::could_see_items(), effect_blind, catacurses::getmaxx(), Creature::has_effect(), map::has_flag(), map::i_at(), line(), m, catacurses::mvwprintw(), mvwprintz(), pgettext(), map::sees_some_items(), item::tname(), trim_and_print(), u, and Character::worn_with_flag().

Referenced by print_all_tile_info().

◆ print_terrain_info()

void game::print_terrain_info ( const tripoint lp,
const catacurses::window w_look,
const std::string &  area_name,
int  column,
int &  line 
)
private

Definition at line 5795 of file game.cpp.

5798{
5799 const int max_width = getmaxx( w_look ) - column - 1;
5800 int lines;
5801
5802 const auto fmt_tile_info = []( const tripoint & lp ) {
5803 map &here = get_map();
5804 std::string ret;
5805 if( debug_mode ) {
5806 ret = string_format( "%s %s", lp.to_string(), here.ter( lp )->id );
5807 if( here.has_furn( lp ) ) {
5808 ret += "; " + here.furn( lp )->id.str();
5809 }
5810 } else {
5811 ret = here.tername( lp );
5812 if( here.has_furn( lp ) ) {
5813 ret += "; " + here.furnname( lp );
5814 }
5815 }
5816 return ret;
5817 };
5818
5819 std::string tile = string_format( "(%s) %s", area_name, fmt_tile_info( lp ) );
5820
5821 if( m.impassable( lp ) ) {
5822 lines = fold_and_print( w_look, point( column, line ), max_width, c_light_gray,
5823 _( "%s; Impassable" ),
5824 tile );
5825 } else {
5826 lines = fold_and_print( w_look, point( column, line ), max_width, c_light_gray,
5827 _( "%s; Movement cost %d" ),
5828 tile, m.move_cost( lp ) * 50 );
5829
5830 const auto ll = get_light_level( std::max( 1.0,
5831 LIGHT_AMBIENT_LIT - m.ambient_light_at( lp ) + 1.0 ) );
5832 mvwprintw( w_look, point( column, ++lines ), _( "Lighting: " ) );
5833 wprintz( w_look, ll.second, ll.first );
5834 }
5835
5836 std::string signage = m.get_signage( lp );
5837 if( !signage.empty() ) {
5838 trim_and_print( w_look, point( column, ++lines ), max_width, c_dark_gray,
5839 // NOLINTNEXTLINE(cata-text-style): the question mark does not end a sentence
5840 u.has_trait( trait_ILLITERATE ) ? _( "Sign: ???" ) : _( "Sign: %s" ), signage );
5841 }
5842
5843 if( m.has_zlevels() && lp.z > -OVERMAP_DEPTH && !m.has_floor( lp ) ) {
5844 // Print info about stuff below
5845 tripoint below( lp.xy(), lp.z - 1 );
5846 std::string tile_below = fmt_tile_info( below );
5847
5848 if( !m.has_floor_or_support( lp ) ) {
5849 fold_and_print( w_look, point( column, ++lines ), max_width, c_dark_gray,
5850 _( "Below: %s; No support" ),
5851 tile_below );
5852 } else {
5853 fold_and_print( w_look, point( column, ++lines ), max_width, c_dark_gray,
5854 _( "Below: %s; Walkable" ),
5855 tile_below );
5856 }
5857 }
5858
5859 int map_features = fold_and_print( w_look, point( column, ++lines ), max_width, c_dark_gray,
5860 m.features( lp ) );
5861 fold_and_print( w_look, point( column, ++lines ), max_width, c_light_gray, _( "Coverage: %d%%" ),
5862 m.coverage( lp ) );
5863 if( line < lines ) {
5864 line = lines + map_features - 1;
5865 }
5866}
Manage and cache data about a part of the map.
Definition: map.h:384
bool has_floor_or_support(const tripoint &p) const
Definition: map.cpp:2039
float ambient_light_at(const tripoint &p) const
Definition: lightmap.cpp:646
std::string features(const tripoint &p)
Definition: map.cpp:1714
int coverage(const tripoint &p) const
Returns coverage value of the tile.
Definition: map.cpp:6258
const std::string & str() const
Returns the identifier as plain std::string.
Definition: string_id.h:255
static constexpr float LIGHT_AMBIENT_LIT
Definition: lightmap.h:18
std::pair< std::string, nc_color > get_light_level(const float light)
Definition: output.cpp:1621
furn_str_id id
Definition: mapdata.h:500
ter_str_id id
Definition: mapdata.h:465

References _, map::ambient_light_at(), c_dark_gray, c_light_gray, map::coverage(), debug_mode, map::features(), fold_and_print(), map::furn(), map::furnname(), get_light_level(), get_map, map::get_signage(), catacurses::getmaxx(), map::has_floor(), map::has_floor_or_support(), map::has_furn(), Character::has_trait(), map::has_zlevels(), ter_t::id, furn_t::id, map::impassable(), LIGHT_AMBIENT_LIT, line(), m, map::move_cost(), catacurses::mvwprintw(), OVERMAP_DEPTH, cata::hash64_detail::ret, string_id< T >::str(), string_format(), map::ter(), map::tername(), tripoint::to_string(), trait_ILLITERATE, trim_and_print(), u, wprintz(), tripoint::xy(), and tripoint::z.

Referenced by print_all_tile_info().

◆ print_trap_info()

void game::print_trap_info ( const tripoint lp,
const catacurses::window w_look,
int  column,
int &  line 
)
private

Definition at line 5886 of file game.cpp.

5889{
5890 const trap &tr = m.tr_at( lp );
5891 if( tr.can_see( lp, u ) ) {
5892 partial_con *pc = m.partial_con_at( lp );
5893 std::string tr_name;
5894 if( pc && tr.loadid == tr_unfinished_construction ) {
5895 const construction &built = pc->id.obj();
5896 tr_name = string_format( _( "Unfinished task: %s, %d%% complete" ), built.group->name(),
5897 pc->counter / 100000 );
5898 } else {
5899 tr_name = tr.name();
5900 }
5901
5902 mvwprintz( w_look, point( column, ++line ), tr.color, tr_name );
5903 }
5904}
partial_con * partial_con_at(const tripoint &p)
Definition: map.cpp:5155
static const trap_str_id tr_unfinished_construction("tr_unfinished_construction")
std::string name() const
construction_group_str_id group
Definition: construction.h:50
construction_id id
nc_color color
Definition: trap.h:93

References _, trap::can_see(), trap::color, partial_con::counter, construction::group, partial_con::id, line(), trap::loadid, m, mvwprintz(), construction_group::name(), trap::name(), int_id< T >::obj(), map::partial_con_at(), string_format(), map::tr_at(), tr_unfinished_construction, and u.

Referenced by print_all_tile_info().

◆ print_vehicle_info()

void game::print_vehicle_info ( const vehicle veh,
int  veh_part,
const catacurses::window w_look,
int  column,
int &  line,
int  last_line 
)
private

Definition at line 5915 of file game.cpp.

5917{
5918 if( veh ) {
5919 mvwprintw( w_look, point( column, ++line ), _( "There is a %s there. Parts:" ), veh->name );
5920 line = veh->print_part_list( w_look, ++line, last_line, getmaxx( w_look ), veh_part );
5921 }
5922}
int print_part_list(const catacurses::window &win, int y1, int max_y, int width, int p, int hl=-1, bool detail=false) const
Prints a list of all parts to the screen inside of a boxed window, possibly highlighting a selected o...

References _, catacurses::getmaxx(), line(), catacurses::mvwprintw(), vehicle::name, and vehicle::print_part_list().

Referenced by print_all_tile_info().

◆ print_visibility_info()

void game::print_visibility_info ( const catacurses::window w_look,
int  column,
int &  line,
visibility_type  visibility 
)
private

Definition at line 5766 of file game.cpp.

5768{
5769 const char *visibility_message = nullptr;
5770 switch( visibility ) {
5771 case VIS_CLEAR:
5772 visibility_message = _( "Clearly visible." );
5773 break;
5774 case VIS_BOOMER:
5775 visibility_message = _( "A bright pink blur." );
5776 break;
5777 case VIS_BOOMER_DARK:
5778 visibility_message = _( "A pink blur." );
5779 break;
5780 case VIS_DARK:
5781 visibility_message = _( "Darkness." );
5782 break;
5783 case VIS_LIT:
5784 visibility_message = _( "Bright light." );
5785 break;
5786 case VIS_HIDDEN:
5787 visibility_message = _( "Unseen." );
5788 break;
5789 }
5790
5791 mvwprintw( w_look, point( line, column ), visibility_message );
5792 line += 2;
5793}

References _, line(), catacurses::mvwprintw(), VIS_BOOMER, VIS_BOOMER_DARK, VIS_CLEAR, VIS_DARK, VIS_HIDDEN, and VIS_LIT.

Referenced by print_all_tile_info().

◆ process_activity()

void game::process_activity ( )
private

Definition at line 1647 of file game.cpp.

1648{
1649 if( !u.activity ) {
1650 return;
1651 }
1652
1653 while( u.moves > 0 && u.activity ) {
1654 u.activity.do_turn( u );
1655 }
1656}
void do_turn(player &p)
Performs the activity for a single turn.

References Character::activity, player_activity::do_turn(), Creature::moves, and u.

Referenced by do_turn().

◆ process_artifact()

void game::process_artifact ( item it,
player p 
)

Definition at line 11276 of file game.cpp.

11277{
11278 const bool worn = p.is_worn( it );
11279 const bool wielded = ( &it == &p.weapon );
11280 std::vector<art_effect_passive> effects = it.type->artifact->effects_carried;
11281 if( worn ) {
11282 const std::vector<art_effect_passive> &ew = it.type->artifact->effects_worn;
11283 effects.insert( effects.end(), ew.begin(), ew.end() );
11284 }
11285 if( wielded ) {
11286 const std::vector<art_effect_passive> &ew = it.type->artifact->effects_wielded;
11287 effects.insert( effects.end(), ew.begin(), ew.end() );
11288 }
11289
11290 if( it.is_tool() ) {
11291 // Recharge it if necessary
11292 if( it.ammo_remaining() < it.ammo_capacity() && calendar::once_every( 1_minutes ) ) {
11293 //Before incrementing charge, check that any extra requirements are met
11294 if( check_art_charge_req( it ) ) {
11295 switch( it.type->artifact->charge_type ) {
11296 case ARTC_NULL:
11297 case NUM_ARTCS:
11298 break; // dummy entries
11299 case ARTC_TIME:
11300 // Once per hour
11301 if( calendar::once_every( 1_hours ) ) {
11302 it.charges++;
11303 }
11304 break;
11305 case ARTC_SOLAR:
11306 if( calendar::once_every( 10_minutes ) &&
11307 is_in_sunlight( p.pos() ) ) {
11308 it.charges++;
11309 }
11310 break;
11311 // Artifacts can inflict pain even on Deadened folks.
11312 // Some weird Lovecraftian thing. ;P
11313 // (So DON'T route them through mod_pain!)
11314 case ARTC_PAIN:
11315 if( calendar::once_every( 1_minutes ) ) {
11316 add_msg( m_bad, _( "You suddenly feel sharp pain for no reason." ) );
11317 p.mod_pain_noresist( 3 * rng( 1, 3 ) );
11318 it.charges++;
11319 }
11320 break;
11321 case ARTC_HP:
11322 if( calendar::once_every( 1_minutes ) ) {
11323 add_msg( m_bad, _( "You feel your body decaying." ) );
11324 p.hurtall( 1, nullptr );
11325 it.charges++;
11326 }
11327 break;
11328 case ARTC_FATIGUE:
11329 if( calendar::once_every( 1_minutes ) ) {
11330 add_msg( m_bad, _( "You feel fatigue seeping into your body." ) );
11331 u.mod_fatigue( 3 * rng( 1, 3 ) );
11332 u.mod_stamina( -90 * rng( 1, 3 ) * rng( 1, 3 ) * rng( 2, 3 ) );
11333 it.charges++;
11334 }
11335 break;
11336 // Portals are energetic enough to charge the item.
11337 // Tears in reality are consumed too, but can't charge it.
11338 case ARTC_PORTAL:
11339 for( const tripoint &dest : m.points_in_radius( p.pos(), 1 ) ) {
11340 m.remove_field( dest, fd_fatigue );
11341 if( m.tr_at( dest ).loadid == tr_portal ) {
11342 add_msg( m_good, _( "The portal collapses!" ) );
11343 m.remove_trap( dest );
11344 it.charges++;
11345 break;
11346 }
11347 }
11348 break;
11349 }
11350 }
11351 }
11352 }
11353
11354 for( const art_effect_passive &i : effects ) {
11355 switch( i ) {
11356 case AEP_STR_UP:
11357 p.mod_str_bonus( +4 );
11358 break;
11359 case AEP_DEX_UP:
11360 p.mod_dex_bonus( +4 );
11361 break;
11362 case AEP_PER_UP:
11363 p.mod_per_bonus( +4 );
11364 break;
11365 case AEP_INT_UP:
11366 p.mod_int_bonus( +4 );
11367 break;
11368 case AEP_ALL_UP:
11369 p.mod_str_bonus( +2 );
11370 p.mod_dex_bonus( +2 );
11371 p.mod_per_bonus( +2 );
11372 p.mod_int_bonus( +2 );
11373 break;
11374 case AEP_SPEED_UP:
11375 // Handled in player::current_speed()
11376 break;
11377
11378 case AEP_PBLUE:
11379 if( p.get_rad() > 0 ) {
11380 p.mod_rad( -1 );
11381 }
11382 break;
11383
11384 case AEP_SMOKE:
11385 if( one_in( 10 ) ) {
11386 tripoint pt( p.posx() + rng( -1, 1 ),
11387 p.posy() + rng( -1, 1 ),
11388 p.posz() );
11389 m.add_field( pt, fd_smoke, rng( 1, 3 ) );
11390 }
11391 break;
11392
11393 case AEP_SNAKES:
11394 break; // Handled in player::hit()
11395
11396 case AEP_EXTINGUISH:
11397 for( const tripoint &dest : m.points_in_radius( p.pos(), 1 ) ) {
11398 m.mod_field_age( dest, fd_fire, -1_turns );
11399 }
11400 break;
11401
11402 case AEP_FUN:
11403 //Bonus fluctuates, wavering between 0 and 30-ish - usually around 12
11404 p.add_morale( MORALE_FEELING_GOOD, rng( 1, 2 ) * rng( 2, 3 ), 0, 3_turns, 0_turns, false );
11405 break;
11406
11407 case AEP_HUNGER:
11408 if( one_in( 100 ) ) {
11409 p.mod_stored_kcal( -10 );
11410 }
11411 break;
11412
11413 case AEP_THIRST:
11414 if( one_in( 120 ) ) {
11415 p.mod_thirst( 1 );
11416 }
11417 break;
11418
11419 case AEP_EVIL:
11420 if( one_in( 150 ) ) { // Once every 15 minutes, on average
11421 p.add_effect( effect_evil, 30_minutes );
11422 if( it.is_armor() ) {
11423 if( !worn ) {
11424 add_msg( _( "You have an urge to wear the %s." ),
11425 it.tname() );
11426 }
11427 } else if( !wielded ) {
11428 add_msg( _( "You have an urge to wield the %s." ),
11429 it.tname() );
11430 }
11431 }
11432 break;
11433
11434 case AEP_SCHIZO:
11435 break; // Handled in player::suffer()
11436
11437 case AEP_RADIOACTIVE:
11438 if( one_in( 4 ) ) {
11439 p.irradiate( 1.0f );
11440 }
11441 break;
11442
11443 case AEP_STR_DOWN:
11444 p.mod_str_bonus( -3 );
11445 break;
11446
11447 case AEP_DEX_DOWN:
11448 p.mod_dex_bonus( -3 );
11449 break;
11450
11451 case AEP_PER_DOWN:
11452 p.mod_per_bonus( -3 );
11453 break;
11454
11455 case AEP_INT_DOWN:
11456 p.mod_int_bonus( -3 );
11457 break;
11458
11459 case AEP_ALL_DOWN:
11460 p.mod_str_bonus( -2 );
11461 p.mod_dex_bonus( -2 );
11462 p.mod_per_bonus( -2 );
11463 p.mod_int_bonus( -2 );
11464 break;
11465
11466 case AEP_SPEED_DOWN:
11467 break; // Handled in player::current_speed()
11468
11469 default:
11470 //Suppress warnings
11471 break;
11472 }
11473 }
11474 // Recalculate, as it might have changed (by mod_*_bonus above)
11475 p.str_cur = p.get_str();
11476 p.int_cur = p.get_int();
11477 p.dex_cur = p.get_dex();
11478 p.per_cur = p.get_per();
11479}
@ ARTC_PORTAL
Definition: artifact.h:69
@ ARTC_FATIGUE
Definition: artifact.h:68
@ ARTC_NULL
Definition: artifact.h:63
@ ARTC_SOLAR
Definition: artifact.h:65
@ NUM_ARTCS
Definition: artifact.h:70
@ ARTC_HP
Definition: artifact.h:67
@ ARTC_TIME
Definition: artifact.h:64
@ ARTC_PAIN
Definition: artifact.h:66
virtual void mod_per_bonus(int nper)
Definition: character.cpp:4196
virtual void mod_dex_bonus(int ndex)
Definition: character.cpp:4191
int str_cur
Definition: character.h:265
void mod_rad(int mod)
Definition: character.cpp:7098
virtual int get_dex() const
Definition: character.cpp:4080
virtual void mod_stored_kcal(int nkcal)
Modifiers for need values exclusive to characters.
Definition: character.cpp:4311
bool is_worn(const item &thing) const
Definition: character.h:1113
virtual int get_int() const
Definition: character.cpp:4088
virtual void mod_fatigue(int nfatigue)
Definition: character.cpp:4442
virtual void mod_str_bonus(int nstr)
Definition: character.cpp:4186
int int_cur
Definition: character.h:267
int get_rad() const
Definition: character.cpp:7088
void add_morale(const morale_type &type, int bonus, int max_bonus=0, const time_duration &duration=1_hours, const time_duration &decay_start=30_minutes, bool capped=false, const itype *item_type=nullptr)
Definition: character.cpp:9001
virtual int get_per() const
Definition: character.cpp:4084
void mod_stamina(int mod)
Definition: character.cpp:7125
void hurtall(int dam, Creature *source, bool disturb=true)
Hurts all body parts for dam, no armor reduction.
Definition: character.cpp:8571
bool irradiate(float rads, bool bypass=false)
Handles mitigation and application of radiation.
Definition: suffer.cpp:1534
virtual void mod_int_bonus(int nint)
Definition: character.cpp:4201
virtual void mod_pain_noresist(int npain)
Definition: creature.cpp:1357
bool is_in_sunlight(const tripoint &p)
Returns true if p is outdoors and it is sunny.
Definition: game.cpp:4805
bool is_tool() const
Definition: item.cpp:6838
int charges
Definition: item.h:2196
bool is_armor() const
Definition: item.cpp:6589
bool add_field(const tripoint &p, const field_type_id &type_id, int intensity=INT_MAX, const time_duration &age=0_turns, bool hit_player=true)
Add field entry at point, or set intensity if present.
Definition: map.cpp:5410
time_duration mod_field_age(const tripoint &p, const field_type_id &type, const time_duration &offset)
Increment/decrement age of field entry at point.
Definition: map.cpp:5330
void remove_trap(const tripoint &p)
Definition: map.cpp:5275
art_effect_passive
Definition: enums.h:99
@ AEP_EXTINGUISH
Definition: enums.h:114
field_type_id fd_smoke
Definition: field_type.cpp:346
field_type_id fd_fatigue
Definition: field_type.cpp:354
static const efftype_id effect_evil("evil")
static const trap_str_id tr_portal("tr_portal")
const morale_type MORALE_FEELING_GOOD("morale_feeling_good")

References _, Creature::add_effect(), map::add_field(), Character::add_morale(), add_msg(), AEP_ALL_DOWN, AEP_ALL_UP, AEP_DEX_DOWN, AEP_DEX_UP, AEP_EVIL, AEP_EXTINGUISH, AEP_FUN, AEP_HUNGER, AEP_INT_DOWN, AEP_INT_UP, AEP_PBLUE, AEP_PER_DOWN, AEP_PER_UP, AEP_RADIOACTIVE, AEP_SCHIZO, AEP_SMOKE, AEP_SNAKES, AEP_SPEED_DOWN, AEP_SPEED_UP, AEP_STR_DOWN, AEP_STR_UP, AEP_THIRST, item::ammo_capacity(), item::ammo_remaining(), ARTC_FATIGUE, ARTC_HP, ARTC_NULL, ARTC_PAIN, ARTC_PORTAL, ARTC_SOLAR, ARTC_TIME, itype::artifact, item::charges, check_art_charge_req(), Character::dex_cur, effect_evil, fd_fatigue, fd_fire, fd_smoke, Character::get_dex(), Character::get_int(), Character::get_per(), Character::get_rad(), Character::get_str(), Character::hurtall(), Character::int_cur, Character::irradiate(), item::is_armor(), is_in_sunlight(), item::is_tool(), Character::is_worn(), trap::loadid, m, m_bad, m_good, Character::mod_dex_bonus(), Character::mod_fatigue(), map::mod_field_age(), Character::mod_int_bonus(), Creature::mod_pain_noresist(), Character::mod_per_bonus(), Character::mod_rad(), Character::mod_stamina(), Character::mod_stored_kcal(), Character::mod_str_bonus(), Character::mod_thirst(), MORALE_FEELING_GOOD, NUM_ARTCS, calendar::once_every(), one_in(), Character::per_cur, map::points_in_radius(), Character::pos(), Character::posx(), Character::posy(), Character::posz(), map::remove_field(), map::remove_trap(), rng(), Character::str_cur, item::tname(), map::tr_at(), tr_portal, item::type, u, and Character::weapon.

◆ process_voluntary_act_interrupt()

void game::process_voluntary_act_interrupt ( )
private

Definition at line 1607 of file game.cpp.

1608{
1609 if( u.has_effect( effect_sleep ) ) {
1610 // Can't interrupt
1611 return;
1612 }
1613
1614 bool has_activity = u.activity && u.activity.moves_left > 0;
1615 bool is_travelling = u.has_destination() && !u.omt_path.empty();
1616
1617 if( !has_activity && !is_travelling ) {
1618 // Nohing to interrupt
1619 return;
1620 }
1621
1622 // Key poll may be quite expensive, so limit it to 10 times per second.
1623 static auto last_poll = std::chrono::steady_clock::now();
1624 auto now = std::chrono::steady_clock::now();
1625 int64_t difference = std::chrono::duration_cast<std::chrono::milliseconds>
1626 ( now - last_poll ).count();
1627
1628 if( difference > 100 ) {
1630 last_poll = now;
1631 }
1632
1633 // If player is performing a task and a monster is dangerously close, warn them
1634 // regardless of previous safemode warnings.
1635 // Distraction Manager can change this.
1636 if( has_activity && !u.has_activity( activity_id( "ACT_AIM" ) ) &&
1638 Creature *hostile_critter = is_hostile_very_close();
1639 if( hostile_critter != nullptr ) {
1641 string_format( _( "The %s is dangerously close!" ),
1642 hostile_critter->get_name() ) );
1643 }
1644 }
1645}
bool has_activity(const activity_id &type) const
Check if player currently has a given activity.
Definition: character.cpp:9132
virtual std::string get_name() const =0
void handle_key_blocking_activity()
Definition: game.cpp:1968
int moves_left
The number of moves remaining in this activity before it is complete.

References _, Character::activity, cancel_activity_or_ignore_query(), effect_sleep, Creature::get_name(), handle_key_blocking_activity(), Character::has_activity(), Character::has_destination(), Creature::has_effect(), hostile_spotted_near, player_activity::is_distraction_ignored(), is_hostile_very_close(), player_activity::moves_left, Character::omt_path, string_format(), and u.

Referenced by do_turn().

◆ prompt_dangerous_tile()

bool game::prompt_dangerous_tile ( const tripoint dest_loc) const

Definition at line 8653 of file game.cpp.

8654{
8655 std::vector<std::string> harmful_stuff = get_dangerous_tile( dest_loc );
8656
8657 if( !harmful_stuff.empty() &&
8658 !query_yn( _( "Really step into %s?" ), enumerate_as_string( harmful_stuff ) ) ) {
8659 return false;
8660 }
8661 if( !harmful_stuff.empty() && u.is_mounted() &&
8662 m.tr_at( dest_loc ).loadid == tr_ledge ) {
8663 add_msg( m_warning, _( "Your %s refuses to move over that ledge!" ),
8664 u.mounted_creature->get_name() );
8665 return false;
8666 }
8667 return true;
8668}

References _, add_msg(), enumerate_as_string(), get_dangerous_tile(), Character::is_mounted(), trap::loadid, m, m_warning, Character::mounted_creature, query_yn(), map::tr_at(), tr_ledge, and u.

Referenced by npc_menu(), and walk_move().

◆ quickload()

void game::quickload ( )
private

Definition at line 11244 of file game.cpp.

11245{
11246 const WORLDPTR active_world = world_generator->active_world;
11247 if( active_world == nullptr ) {
11248 return;
11249 }
11250
11251 if( active_world->save_exists( save_t::from_player_name( u.name ) ) ) {
11252 if( moves_since_last_save != 0 ) { // See if we need to reload anything
11253 MAPBUFFER.reset();
11255 try {
11256 setup();
11257 } catch( const std::exception &err ) {
11258 debugmsg( "Error: %s", err.what() );
11259 }
11261 }
11262 } else {
11263 popup_getkey( _( "No saves for %s yet." ), u.name );
11264 }
11265}
bool load(const std::string &world)
Attempt to load first valid save (if any) in world.
Definition: game.cpp:2505
void setup()
Definition: game.cpp:471
static save_t from_player_name(const std::string &name)
int popup_getkey(const char *const mes, Args &&... args)
Definition: output.h:500
bool save_exists(const save_t &name) const

References _, overmapbuffer::clear(), debugmsg, save_t::from_player_name(), load(), MAPBUFFER, moves_since_last_save, Character::name, overmap_buffer, popup_getkey(), mapbuffer::reset(), WORLD::save_exists(), setup(), u, and world_generator.

Referenced by handle_action().

◆ quicksave()

void game::quicksave ( )

Definition at line 11222 of file game.cpp.

11223{
11224 //Don't autosave if the player hasn't done anything since the last autosave/quicksave,
11225 if( !moves_since_last_save ) {
11226 return;
11227 }
11228 add_msg( m_info, _( "Saving game, this may take a while" ) );
11229
11231 popup.message( "%s", _( "Saving game, this may take a while" ) );
11234
11235 time_t now = time( nullptr ); //timestamp for start of saving procedure
11236
11237 //perform save
11238 save();
11239 //Now reset counters for autosaving, so we don't immediately autosave after a quicksave or autosave.
11241 last_save_timestamp = now;
11242}

References _, add_msg(), last_save_timestamp, m_info, moves_since_last_save, popup(), ui_manager::redraw(), refresh_display(), and save().

Referenced by autosave(), and handle_action().

◆ reenter_fullscreen()

void game::reenter_fullscreen ( )

Definition at line 459 of file game.cpp.

460{
461 if( was_fullscreen ) {
462 if( !fullscreen ) {
464 }
465 }
466}

References fullscreen, toggle_fullscreen(), and was_fullscreen.

Referenced by list_items_monsters(), and look_around().

◆ reload_npcs()

void game::reload_npcs ( )

Unloads, then loads the NPCs.

Definition at line 864 of file game.cpp.

865{
866 // TODO: Make it not invoke the "on_unload" command for the NPCs that will be loaded anyway
867 // and not invoke "on_load" for those NPCs that avoided unloading this way.
868 unload_npcs();
869 load_npcs();
870}

References load_npcs(), and unload_npcs().

Referenced by load(), overmap_npc_move(), vertical_move(), and vertical_shift().

◆ reload_tileset()

void game::reload_tileset ( std::function< void(std::string)>  out)

Definition at line 423 of file game.cpp.

424{
425#if defined(TILES)
426 // Disable UIs below to avoid accessing the tile context during loading.
428 try {
429 tilecontext->reinit();
430 std::vector<mod_id> dummy;
431 tilecontext->load_tileset(
432 get_option<std::string>( "TILES" ),
433 world_generator->active_world ? world_generator->active_world->active_mod_order : dummy,
434 /*precheck=*/false,
435 /*force=*/true,
436 /*pump_events=*/true
437 );
438 tilecontext->do_tile_loading_report( out );
439 } catch( const std::exception &err ) {
440 popup( _( "Loading the tileset failed: %s" ), err.what() );
441 }
442 g->reset_zoom();
443 g->mark_main_ui_adaptor_resize();
444#endif // TILES
445}

References _, g, popup(), and world_generator.

Referenced by handle_action().

◆ remoteveh()

vehicle * game::remoteveh ( )

Returns the current remotely controlled vehicle.

Definition at line 2245 of file game.cpp.

2246{
2248 return remoteveh_cache;
2249 }
2251 std::stringstream remote_veh_string( u.get_value( "remote_controlling_vehicle" ) );
2252 if( remote_veh_string.str().empty() ||
2254 remoteveh_cache = nullptr;
2255 } else {
2256 tripoint vp;
2257 remote_veh_string >> vp.x >> vp.y >> vp.z;
2258 vehicle *veh = veh_pointer_or_null( m.veh_at( vp ) );
2259 if( veh && veh->fuel_left( itype_battery, true ) > 0 ) {
2260 remoteveh_cache = veh;
2261 } else {
2262 remoteveh_cache = nullptr;
2263 }
2264 }
2265 return remoteveh_cache;
2266}
vehicle * remoteveh_cache
Definition: game.h:1045
int fuel_left(const itype_id &ftype, bool recurse=false) const
Definition: vehicle.cpp:3359
static const bionic_id bio_remote("bio_remote")
static const itype_id itype_remotevehcontrol("remotevehcontrol")
static const itype_id itype_battery("battery")

References bio_remote, vehicle::fuel_left(), Creature::get_value(), Character::has_active_bionic(), Character::has_active_item(), itype_battery, itype_remotevehcontrol, m, remoteveh_cache, remoteveh_cache_time, calendar::turn, u, map::veh_at(), veh_pointer_or_null(), tripoint::x, tripoint::y, and tripoint::z.

Referenced by control_vehicle(), and handle_action().

◆ remove_npc_follower()

void game::remove_npc_follower ( const character_id id)

Remove follower id from follower set.

Definition at line 1877 of file game.cpp.

1878{
1879 follower_ids.erase( id );
1880 u.follower_ids.erase( id );
1881}

References follower_ids, player::follower_ids, and u.

Referenced by cleanup_dead().

◆ remove_zombie()

void game::remove_zombie ( const monster critter)

Definition at line 4684 of file game.cpp.

4685{
4686 critter_tracker->remove( critter );
4687}

References critter_tracker.

Referenced by despawn_monster(), disable_robot(), start_game(), and vertical_move().

◆ replace_stair_monsters()

void game::replace_stair_monsters ( )
private

Definition at line 10742 of file game.cpp.

10743{
10744 for( auto &elem : coming_to_stairs ) {
10745 elem.staircount = 0;
10746 const tripoint pnt( elem.pos().xy(), get_levz() );
10747 place_critter_around( make_shared_fast<monster>( elem ), pnt, 10 );
10748 }
10749
10750 coming_to_stairs.clear();
10751}
std::vector< monster > coming_to_stairs
Definition: game.h:983

References coming_to_stairs, get_levz(), and place_critter_around().

◆ reset_item_list_state()

void game::reset_item_list_state ( const catacurses::window window,
int  height,
bool  bRadiusSort 
)
private

Definition at line 7117 of file game.cpp.

7119{
7120 const int width = getmaxx( window );
7121 for( int i = 1; i < TERMX; i++ ) {
7122 if( i < width ) {
7123 mvwputch( window, point( i, 0 ), c_light_gray, LINE_OXOX ); // -
7124 mvwputch( window, point( i, TERMY - height - 1 ), c_light_gray,
7125 LINE_OXOX ); // -
7126 }
7127
7128 if( i < TERMY - height ) {
7129 mvwputch( window, point( 0, i ), c_light_gray, LINE_XOXO ); // |
7130 mvwputch( window, point( width - 1, i ), c_light_gray, LINE_XOXO ); // |
7131 }
7132 }
7133
7134 mvwputch( window, point_zero, c_light_gray, LINE_OXXO ); // |^
7135 mvwputch( window, point( width - 1, 0 ), c_light_gray, LINE_OOXX ); // ^|
7136
7137 mvwputch( window, point( 0, TERMY - height - 1 ), c_light_gray,
7138 LINE_XXXO ); // |-
7139 mvwputch( window, point( width - 1, TERMY - height - 1 ), c_light_gray,
7140 LINE_XOXX ); // -|
7141
7142 mvwprintz( window, point( 2, 0 ), c_light_green, "<Tab> " );
7143 wprintz( window, c_white, _( "Items" ) );
7144
7145 std::string sSort;
7146 if( bRadiusSort ) {
7147 //~ Sort type: distance.
7148 sSort = _( "<s>ort: dist" );
7149 } else {
7150 //~ Sort type: category.
7151 sSort = _( "<s>ort: cat" );
7152 }
7153
7154 int letters = utf8_width( sSort );
7155
7156 shortcut_print( window, point( getmaxx( window ) - letters, 0 ), c_white, c_light_green, sSort );
7157
7158 std::vector<std::string> tokens;
7159 if( !sFilter.empty() ) {
7160 tokens.emplace_back( _( "<R>eset" ) );
7161 }
7162
7163 tokens.emplace_back( _( "<E>xamine" ) );
7164 tokens.emplace_back( _( "<C>ompare" ) );
7165 tokens.emplace_back( _( "<F>ilter" ) );
7166 tokens.emplace_back( _( "<+/->Priority" ) );
7167
7168 int gaps = tokens.size() + 1;
7169 letters = 0;
7170 int n = tokens.size();
7171 for( int i = 0; i < n; i++ ) {
7172 letters += utf8_width( tokens[i] ) - 2; //length ignores < >
7173 }
7174
7175 int usedwidth = letters;
7176 const int gap_spaces = ( width - usedwidth ) / gaps;
7177 usedwidth += gap_spaces * gaps;
7178 point pos( gap_spaces + ( width - usedwidth ) / 2, TERMY - height - 1 );
7179
7180 for( int i = 0; i < n; i++ ) {
7181 pos.x += shortcut_print( window, pos, c_white, c_light_green,
7182 tokens[i] ) + gap_spaces;
7183 }
7184}
#define LINE_OOXX
Definition: output.h:43
#define LINE_OXXO
Definition: output.h:42

References _, c_light_gray, c_light_green, c_white, catacurses::getmaxx(), LINE_OOXX, LINE_OXOX, LINE_OXXO, LINE_XOXO, LINE_XOXX, LINE_XXXO, mvwprintz(), mvwputch(), point_zero, sFilter, shortcut_print(), TERMX, TERMY, utf8_width(), wprintz(), and point::x.

Referenced by list_items().

◆ reset_light_level()

void game::reset_light_level ( )

Definition at line 3543 of file game.cpp.

3544{
3545 for( float &lev : latest_lightlevels ) {
3546 lev = -std::numeric_limits<float>::max();
3547 }
3548}

References latest_lightlevels.

Referenced by do_turn(), and game().

◆ reset_npc_dispositions()

void game::reset_npc_dispositions ( )
private

Definition at line 2618 of file game.cpp.

2619{
2620 for( auto elem : follower_ids ) {
2621 shared_ptr_fast<npc> npc_to_get = overmap_buffer.find_npc( elem );
2622 if( !npc_to_get ) {
2623 continue;
2624 }
2625 npc *npc_to_add = npc_to_get.get();
2626 npc_to_add->chatbin.missions.clear();
2627 npc_to_add->chatbin.missions_assigned.clear();
2628 npc_to_add->mission = NPC_MISSION_NULL;
2629 npc_to_add->chatbin.mission_selected = nullptr;
2630 npc_to_add->set_attitude( NPCATT_NULL );
2631 npc_to_add->op_of_u.anger = 0;
2632 npc_to_add->op_of_u.fear = 0;
2633 npc_to_add->op_of_u.trust = 0;
2634 npc_to_add->op_of_u.value = 0;
2635 npc_to_add->op_of_u.owed = 0;
2636 npc_to_add->set_fac( faction_id( "no_faction" ) );
2638 npc_to_add->global_omt_location(),
2639 npc_to_add->getID() ) );
2640
2641 }
2642
2643}
void set_attitude(npc_attitude new_attitude)
Definition: npc.cpp:3144
npc_chatbin chatbin
Definition: npc.h:1328
void add_new_mission(mission *miss)
See npc_chatbin::add_new_mission.
Definition: npc.cpp:2640
npc_opinion op_of_u
Definition: npc.h:1327
void set_fac(const faction_id &id)
Definition: npc.cpp:466
std::vector< mission * > missions_assigned
Mission that have been assigned by this NPC to a player character.
Definition: npc.h:752
mission * mission_selected
The mission (if any) that we talk about right now.
Definition: npc.h:757
std::vector< mission * > missions
Missions that the NPC can give out.
Definition: npc.h:748
int value
Definition: npc.h:242
int trust
Definition: npc.h:240
int owed
Definition: npc.h:244
int fear
Definition: npc.h:241
int anger
Definition: npc.h:243

References npc::add_new_mission(), npc_opinion::anger, npc::chatbin, npc_opinion::fear, overmapbuffer::find_npc(), follower_ids, Character::getID(), Character::global_omt_location(), npc::mission, npc_chatbin::mission_selected, npc_chatbin::missions, npc_chatbin::missions_assigned, NPC_MISSION_NULL, NPCATT_NULL, npc::op_of_u, ORIGIN_ANY_NPC, overmap_buffer, npc_opinion::owed, mission::reserve_random(), npc::set_attitude(), npc::set_fac(), npc_opinion::trust, and npc_opinion::value.

Referenced by cleanup_at_end().

◆ reset_zoom()

void game::reset_zoom ( )

Definition at line 7032 of file game.cpp.

7033{
7034#if defined(TILES)
7036 rescale_tileset( tileset_zoom );
7037#endif // TILES
7038}

References DEFAULT_TILESET_ZOOM, and tileset_zoom.

◆ revive_corpse()

bool game::revive_corpse ( const tripoint p,
item it 
)

Revives a corpse at given location.

The monster type and some of its properties are deducted from the corpse. If reviving succeeds, the location is guaranteed to have a new monster there (see critter_at).

Parameters
pThe place where to put the revived monster.
itThe corpse item, it must be a valid corpse (see item::is_corpse).
Returns
Whether the corpse has actually been redivided. Reviving may fail for many reasons, including no space to put the monster, corpse being to much damaged etc. If the monster was revived, the caller should remove the corpse item. If reviving failed, the item is unchanged, as is the environment (no new monsters).

Definition at line 4815 of file game.cpp.

4816{
4817 if( !it.is_corpse() ) {
4818 debugmsg( "Tried to revive a non-corpse." );
4819 return false;
4820 }
4821 shared_ptr_fast<monster> newmon_ptr = make_shared_fast<monster>
4822 ( it.get_mtype()->id );
4823 monster &critter = *newmon_ptr;
4824 critter.init_from_item( it );
4825 if( critter.get_hp() < 1 ) {
4826 // Failed reanimation due to corpse being too burned
4827 return false;
4828 }
4829 if( it.has_flag( "FIELD_DRESS" ) || it.has_flag( "FIELD_DRESS_FAILED" ) ||
4830 it.has_flag( "QUARTERED" ) ) {
4831 // Failed reanimation due to corpse being butchered
4832 return false;
4833 }
4834
4835 critter.no_extra_death_drops = true;
4836 critter.add_effect( effect_downed, 5_turns, num_bp );
4837 for( const item &component : it.components ) {
4838 critter.corpse_components.push_back( component );
4839 }
4840
4841 if( it.get_var( "zlave" ) == "zlave" ) {
4842 critter.add_effect( effect_pacified, 1_turns, num_bp );
4843 critter.add_effect( effect_pet, 1_turns, num_bp );
4844 }
4845
4846 if( it.get_var( "no_ammo" ) == "no_ammo" ) {
4847 for( auto &ammo : critter.ammo ) {
4848 ammo.second = 0;
4849 }
4850 }
4851
4852 return place_critter_at( newmon_ptr, p );
4853}
monster * place_critter_at(const mtype_id &id, const tripoint &p)
Adds critters to the reality bubble, creating them if necessary.
Definition: game.cpp:4612
double get_var(const std::string &name, double default_value) const
Definition: item.cpp:1030
const mtype * get_mtype() const
Definition: item.cpp:6510
std::list< item > components
Definition: item.h:2159
bool has_flag(const std::string &flag) const
Definition: item.cpp:5227
bool is_corpse() const
Whether this is a corpse item.
Definition: item.cpp:6505
int get_hp(const bodypart_id &) const override
Definition: monster.cpp:2918
bool no_extra_death_drops
Definition: monster.h:482
std::vector< item > corpse_components
Definition: monster.h:459
void init_from_item(const item &itm)
Initialize values like speed / hp from data of an item.
Definition: monster.cpp:2782
static const efftype_id effect_downed("downed")
static const efftype_id effect_pacified("pacified")

References monster::add_effect(), monster::ammo, item::components, monster::corpse_components, debugmsg, effect_downed, effect_pacified, effect_pet, monster::get_hp(), item::get_mtype(), item::get_var(), item::has_flag(), mtype::id, monster::init_from_item(), item::is_corpse(), monster::no_extra_death_drops, num_bp, and place_critter_at().

◆ save()

bool game::save ( )

Returns false if saving failed.

Definition at line 2719 of file game.cpp.

2720{
2721 try {
2722 if( !save_player_data() ||
2724 !save_artifacts() ||
2725 !save_maps() ||
2726 !get_auto_pickup().save_character() ||
2728 !get_safemode().save_character() ||
2729 !write_to_file( get_world_base_save_path() + "/uistate.json", [&]( std::ostream & fout ) {
2730 JsonOut jsout( fout );
2731 uistate.serialize( jsout );
2732 }, _( "uistate data" ) ) ) {
2733 return false;
2734 } else {
2735 world_generator->active_world->add_save( save_t::from_player_name( u.name ) );
2736 return true;
2737 }
2738 } catch( std::ios::failure &err ) {
2739 popup( _( "Failed to save game data" ) );
2740 return false;
2741 }
2742}
void write_to_file(const std::string &path, const std::function< void(std::ostream &)> &writer)
Definition: json.h:580
bool save_player_data()
Definition: game.cpp:2673
void serialize(JsonOut &json) const
@ failure
Definition: behavior.h:20

References _, behavior::failure, save_t::from_player_name(), get_auto_notes_settings(), get_auto_pickup(), get_safemode(), get_world_base_save_path(), Character::name, popup(), save(), save_artifacts(), save_factions_missions_npcs(), save_maps(), save_player_data(), uistatedata::serialize(), u, uistate, world_generator, and write_to_file().

Referenced by handle_action(), quicksave(), and save().

◆ save_artifacts()

bool game::save_artifacts ( )
private

Definition at line 2654 of file game.cpp.

2655{
2656 std::string artfilename = get_world_base_save_path() + "/" + SAVE_ARTIFACTS;
2657 return ::save_artifacts( artfilename );
2658}
bool save_artifacts(const std::string &path)
Definition: artifact.cpp:1277
static const std::string SAVE_ARTIFACTS("artifacts.gsav")

References get_world_base_save_path(), SAVE_ARTIFACTS(), and save_artifacts().

Referenced by cleanup_at_end(), and save().

◆ save_cyborg()

void game::save_cyborg ( item cyborg,
const tripoint couch_pos,
player installer 
)

Turns Broken Cyborg monster into Cyborg NPC via surgery.

Definition at line 4876 of file game.cpp.

4877{
4878 int assist_bonus = installer.get_effect_int( effect_assisted );
4879
4880 float adjusted_skill = installer.bionics_adjusted_skill( skill_firstaid,
4883 -1 );
4884
4885 int damage = cyborg->damage();
4886 int dmg_lvl = cyborg->damage_level( 4 );
4887 int difficulty = 12;
4888
4889 if( damage != 0 ) {
4890
4891 popup( _( "WARNING: Patient's body is damaged. Difficulty of the procedure is increased by %s." ),
4892 dmg_lvl );
4893
4894 // Damage of the cyborg increases difficulty
4895 difficulty += dmg_lvl;
4896 }
4897
4898 int chance_of_success = bionic_manip_cos( adjusted_skill + assist_bonus, difficulty );
4899 int success = chance_of_success - rng( 1, 100 );
4900
4901 if( !g->u.query_yn(
4902 _( "WARNING: %i percent chance of SEVERE damage to all body parts! Continue anyway?" ),
4903 100 - static_cast<int>( chance_of_success ) ) ) {
4904 return;
4905 }
4906
4907 if( success > 0 ) {
4908 add_msg( m_good, _( "Successfully removed Personality override." ) );
4909 add_msg( m_bad, _( "Autodoc immediately destroys the CBM upon removal." ) );
4910
4911 delete_cyborg_item( g->m, couch_pos, cyborg );
4912
4913 const string_id<npc_template> npc_cyborg( "cyborg_rescued" );
4914 shared_ptr_fast<npc> tmp = make_shared_fast<npc>();
4915 tmp->normalize();
4916 tmp->load_npc_template( npc_cyborg );
4917 tmp->spawn_at_precise( { get_levx(), get_levy() }, couch_pos );
4919 tmp->hurtall( dmg_lvl * 10, nullptr );
4920 tmp->add_effect( effect_downed, rng( 1_turns, 4_turns ), num_bp, 0, true );
4921 load_npcs();
4922
4923 } else {
4924 const int failure_level = static_cast<int>( std::sqrt( std::abs( success ) * 4.0 * difficulty /
4925 adjusted_skill ) );
4926 const int fail_type = std::min( 5, failure_level );
4927 switch( fail_type ) {
4928 case 1:
4929 case 2:
4930 add_msg( m_info, _( "The removal fails." ) );
4931 add_msg( m_bad, _( "The body is damaged." ) );
4932 cyborg->set_damage( damage + 1000 );
4933 break;
4934 case 3:
4935 case 4:
4936 add_msg( m_info, _( "The removal fails badly." ) );
4937 add_msg( m_bad, _( "The body is badly damaged!" ) );
4938 cyborg->set_damage( damage + 2000 );
4939 break;
4940 case 5:
4941 add_msg( m_info, _( "The removal is a catastrophe." ) );
4942 add_msg( m_bad, _( "The body is destroyed!" ) );
4943 delete_cyborg_item( g->m, couch_pos, cyborg );
4944 break;
4945 default:
4946 break;
4947 }
4948
4949 }
4950
4951}
int bionic_manip_cos(float adjusted_skill, int bionic_difficulty)
Definition: bionics.cpp:1879
float bionics_adjusted_skill(const skill_id &most_important_skill, const skill_id &important_skill, const skill_id &least_important_skill, int skill_level=-1)
Calculate skill for (un)installing bionics.
Definition: bionics.cpp:1836
item & set_damage(int qty)
Filter setting damage constrained by min_damage and max_damage.
Definition: item.cpp:714
int damage_level(int max) const
Scale item damage to the given number of levels.
Definition: item.cpp:701
int damage() const
How much damage has the item sustained?
Definition: item.cpp:696
static const skill_id skill_computer("computer")
static void delete_cyborg_item(map &m, const tripoint &couch_pos, item *cyborg)
Definition: game.cpp:4855
static const efftype_id effect_assisted("assisted")
static const skill_id skill_electronics("electronics")
@ success
Definition: behavior.h:20

References _, add_msg(), bionic_manip_cos(), Character::bionics_adjusted_skill(), item::damage(), item::damage_level(), delete_cyborg_item(), effect_assisted, effect_downed, g, Creature::get_effect_int(), get_levx(), get_levy(), overmapbuffer::insert_npc(), load_npcs(), m_bad, m_good, m_info, num_bp, overmap_buffer, popup(), rng(), item::set_damage(), skill_computer, skill_electronics, skill_firstaid, and behavior::success.

◆ save_factions_missions_npcs()

bool game::save_factions_missions_npcs ( )
private

Definition at line 2646 of file game.cpp.

2647{
2648 std::string masterfile = get_world_base_save_path() + "/" + SAVE_MASTER;
2649 return write_to_file( masterfile, [&]( std::ostream & fout ) {
2650 serialize_master( fout );
2651 }, _( "factions data" ) );
2652}
void serialize_master(std::ostream &fout)
Definition: savegame.cpp:1243

References _, get_world_base_save_path(), SAVE_MASTER(), serialize_master(), and write_to_file().

Referenced by cleanup_at_end(), and save().

◆ save_maps()

bool game::save_maps ( )
private

Definition at line 2660 of file game.cpp.

2661{
2662 try {
2663 m.save();
2664 overmap_buffer.save(); // can throw
2665 MAPBUFFER.save(); // can throw
2666 return true;
2667 } catch( const std::exception &err ) {
2668 popup( _( "Failed to save the maps: %s" ), err.what() );
2669 return false;
2670 }
2671}
void save(bool delete_after_save=false)
Store all submaps in this instance into savefiles.
Definition: mapbuffer.cpp:103

References _, m, MAPBUFFER, overmap_buffer, popup(), map::save(), overmapbuffer::save(), and mapbuffer::save().

Referenced by cleanup_at_end(), and save().

◆ save_player_data()

bool game::save_player_data ( )
private

Definition at line 2673 of file game.cpp.

2674{
2675 const std::string playerfile = get_player_base_save_path();
2676
2677 const bool saved_data = write_to_file( playerfile + SAVE_EXTENSION, [&]( std::ostream & fout ) {
2678 serialize( fout );
2679 }, _( "player data" ) );
2680 const bool saved_map_memory = u.save_map_memory();
2681 const bool saved_log = write_to_file( playerfile + SAVE_EXTENSION_LOG, [&](
2682 std::ostream & fout ) {
2683 fout << memorial().dump();
2684 }, _( "player memorial" ) );
2685#if defined(__ANDROID__)
2686 const bool saved_shortcuts = write_to_file( playerfile + SAVE_EXTENSION_SHORTCUTS, [&](
2687 std::ostream & fout ) {
2688 save_shortcuts( fout );
2689 }, _( "quick shortcuts" ) );
2690#endif
2691 const bool saved_diary = u.get_avatar_diary()->store();
2692 return saved_data && saved_map_memory && saved_log && saved_diary
2693#if defined(__ANDROID__)
2694 && saved_shortcuts
2695#endif
2696 ;
2697}
bool save_map_memory()
Definition: avatar.cpp:132
bool store()
Definition: diary.cpp:760
std::string get_player_base_save_path() const
Base path for saving player data.
Definition: game.cpp:11961
void serialize(std::ostream &fout)
Saving and loading functions.
Definition: savegame.cpp:69
std::string dump() const
Concatenates all of the memorial log entries, delimiting them with newlines, and returns the resultin...

References _, memorial_logger::dump(), avatar::get_avatar_diary(), get_player_base_save_path(), memorial(), SAVE_EXTENSION(), SAVE_EXTENSION_LOG(), SAVE_EXTENSION_SHORTCUTS(), avatar::save_map_memory(), serialize(), diary::store(), u, and write_to_file().

Referenced by save().

◆ serialize()

void game::serialize ( std::ostream &  fout)

Saving and loading functions.

Definition at line 69 of file savegame.cpp.

70{
71 /*
72 * Format version 12: Fully json, save the header. Weather and memorial exist elsewhere.
73 * To prevent (or encourage) confusion, there is no version 8. (cata 0.8 uses v7)
74 */
75 // Header
76 fout << "# version " << savegame_version << std::endl;
77
78 JsonOut json( fout, true ); // pretty-print
79
80 json.start_object();
81 // basic game state information.
82 json.member( "turn", calendar::turn );
84 json.member( "calendar_start", calendar_config._start_of_cataclysm );
85 json.member( "game_start", calendar_config._start_of_game );
86 json.member( "initial_season", static_cast<int>( calendar_config._initial_season ) );
87 json.member( "auto_travel_mode", auto_travel_mode );
88 json.member( "run_mode", static_cast<int>( safe_mode ) );
89 json.member( "mostseen", mostseen );
90 // current map coordinates
91 tripoint pos_sm = m.get_abs_sub();
92 const point pos_om = sm_to_om_remain( pos_sm.x, pos_sm.y );
93 json.member( "levx", pos_sm.x );
94 json.member( "levy", pos_sm.y );
95 json.member( "levz", pos_sm.z );
96 json.member( "om_x", pos_om.x );
97 json.member( "om_y", pos_om.y );
98
99 json.member( "grscent", scent.serialize() );
100 json.member( "typescent", scent.serialize( true ) );
101
102 // Then each monster
103 json.member( "active_monsters", *critter_tracker );
104 json.member( "stair_monsters", coming_to_stairs );
105
106 // save stats.
107 json.member( "kill_tracker", *kill_tracker_ptr );
108 json.member( "stats_tracker", *stats_tracker_ptr );
109 json.member( "achievements_tracker", *achievements_tracker_ptr );
110
111 json.member( "token_provider", *token_provider_ptr );
112
113 json.member( "player", u );
114 Messages::serialize( json );
115
116 json.end_object();
117}
A class that keeps time data other than current time.
Definition: calendar.h:530
season_type _initial_season
Definition: calendar.h:534
time_point _start_of_game
Definition: calendar.h:533
time_point _start_of_cataclysm
Definition: calendar.h:532
pimpl< drop_token_provider > token_provider_ptr
Definition: game.h:975
std::string serialize(bool is_type=false) const
Definition: savegame.cpp:119
point sm_to_om_remain(int &x, int &y)
void serialize(JsonOut &json)
Definition: messages.cpp:321
calendar_config config
const int savegame_version
Definition: savegame.cpp:57

References calendar_config::_initial_season, calendar_config::_start_of_cataclysm, calendar_config::_start_of_game, achievements_tracker_ptr, auto_travel_mode, coming_to_stairs, calendar::config, critter_tracker, JsonOut::end_object(), map::get_abs_sub(), kill_tracker_ptr, m, JsonOut::member(), mostseen, safe_mode, savegame_version, scent, scent_map::serialize(), Messages::serialize(), sm_to_om_remain(), JsonOut::start_object(), stats_tracker_ptr, token_provider_ptr, calendar::turn, u, point::x, tripoint::x, point::y, tripoint::y, and tripoint::z.

Referenced by save_player_data().

◆ serialize_master()

void game::serialize_master ( std::ostream &  fout)
private

Definition at line 1243 of file savegame.cpp.

1244{
1245 fout << "# version " << savegame_version << std::endl;
1246 try {
1247 JsonOut json( fout, true ); // pretty-print
1248 json.start_object();
1249
1250 json.member( "next_mission_id", next_mission_id );
1251 json.member( "next_npc_id", next_npc_id );
1252
1253 json.member( "active_missions" );
1254 mission::serialize_all( json );
1255
1256 json.member( "factions", *faction_manager_ptr );
1257 json.member( "seed", seed );
1258
1259 json.member( "weather" );
1260 json.start_object();
1261 json.member( "lightning", get_weather().lightning_active );
1262 json.end_object();
1263
1264 json.end_object();
1265 } catch( const JsonError &e ) {
1266 debugmsg( "error saving to %s: %s", SAVE_MASTER, e.c_str() );
1267 }
1268}
Definition: json.h:51
const char * c_str() const noexcept
Definition: json.h:54
static void serialize_all(JsonOut &json)
Definition: savegame.cpp:1234

References JsonError::c_str(), debugmsg, JsonOut::end_object(), faction_manager_ptr, get_weather, JsonOut::member(), next_mission_id, next_npc_id, SAVE_MASTER(), savegame_version, seed, mission::serialize_all(), and JsonOut::start_object().

Referenced by save_factions_missions_npcs().

◆ set_critter_died()

void game::set_critter_died ( )

If invoked, dead will be cleaned this turn.

Definition at line 1785 of file game.cpp.

1786{
1787 critter_died = true;
1788}

References critter_died.

◆ set_driving_view_offset()

void game::set_driving_view_offset ( const point p)

Definition at line 1595 of file game.cpp.

1596{
1597 // remove the previous driving offset,
1598 // store the new offset and apply the new offset.
1605}

References driving_view_offset, u, player::view_offset, point::x, tripoint::x, point::y, and tripoint::y.

Referenced by calc_driving_offset(), and cleanup_at_end().

◆ set_npcs_dirty()

void game::set_npcs_dirty ( )

If invoked, NPCs will be reloaded before next turn.

Definition at line 1780 of file game.cpp.

1781{
1782 npcs_dirty = true;
1783}

References npcs_dirty.

◆ set_safe_mode()

void game::set_safe_mode ( safe_mode_type  mode)

Definition at line 8580 of file game.cpp.

8581{
8582 safe_mode = mode;
8584}

References safe_mode, and safe_mode_warning_logged.

Referenced by handle_action(), and mon_info_update().

◆ set_zoom()

void game::set_zoom ( int  level)

Definition at line 7040 of file game.cpp.

7041{
7042#if defined(TILES)
7043 if( tileset_zoom != level ) {
7044 tileset_zoom = level;
7045 rescale_tileset( tileset_zoom );
7046 }
7047#else
7048 static_cast<void>( level );
7049#endif // TILES
7050}

References tileset_zoom.

Referenced by look_around().

◆ setremoteveh()

void game::setremoteveh ( vehicle veh)

Sets the current remotely controlled vehicle.

Definition at line 2268 of file game.cpp.

2269{
2271 remoteveh_cache = veh;
2272 if( veh != nullptr && !u.has_active_bionic( bio_remote ) &&
2274 debugmsg( "Tried to set remote vehicle without bio_remote or remotevehcontrol" );
2275 veh = nullptr;
2276 }
2277
2278 if( veh == nullptr ) {
2279 u.remove_value( "remote_controlling_vehicle" );
2280 return;
2281 }
2282
2283 std::stringstream remote_veh_string;
2284 const tripoint vehpos = veh->global_pos3();
2285 remote_veh_string << vehpos.x << ' ' << vehpos.y << ' ' << vehpos.z;
2286 u.set_value( "remote_controlling_vehicle", remote_veh_string.str() );
2287}
void remove_value(const std::string &key)
Definition: creature.cpp:1341

References bio_remote, debugmsg, vehicle::global_pos3(), Character::has_active_bionic(), Character::has_active_item(), itype_remotevehcontrol, remoteveh_cache, remoteveh_cache_time, Creature::remove_value(), Creature::set_value(), calendar::turn, u, tripoint::x, tripoint::y, and tripoint::z.

◆ setup()

void game::setup ( )

Definition at line 471 of file game.cpp.

472{
473 loading_ui ui( true );
474
476
477 if( get_option<bool>( "ELEVATED_BRIDGES" ) && !get_option<bool>( "ZLEVELS" ) ) {
478 debugmsg( "\"Elevated bridges\" mod requires z-levels to be ENABLED to work properly!" );
479 }
480
481 m = map( get_option<bool>( "ZLEVELS" ) );
482
484 next_mission_id = 1;
485 new_game = true;
486 uquit = QUIT_NO; // We haven't quit the game
487 bVMonsterLookFire = true;
488
489 // invalidate calendar caches in case we were previously playing
490 // a different world
491 calendar::set_eternal_season( ::get_option<bool>( "ETERNAL_SEASON" ) );
492 calendar::set_season_length( ::get_option<int>( "SEASON_LENGTH" ) );
493
496
497 turnssincelastmon = 0; //Auto safe mode init
498
501 coming_to_stairs.clear();
502 active_npc.clear();
503 faction_manager_ptr->clear();
508
509 SCT.vSCT.clear(); //Delete pending messages
510
511 stats().clear();
512 // reset kill counts
513 kill_tracker_ptr->clear();
515 // reset follower list
516 follower_ids.clear();
517 scent.reset();
518
520 remoteveh_cache = nullptr;
521
522 token_provider_ptr->clear();
523 // back to menu for save loading, new game etc
524}
void clear_zombies()
Redirects to the creature_tracker clear() function.
Definition: game.cpp:4689
static void clear_all()
Remove all active missions, used to cleanup on exit and before reloading a new game.
Definition: mission.cpp:127
void reset()
Definition: scent_map.cpp:51
static const string_id< weather_type > & NULL_ID()
Returns a null id whose string_id<T>::is_null() must always return true.
void clear_messages()
Definition: messages.cpp:351
void load_world_modfiles(loading_ui &ui, const std::string &artifacts_file)
Load & finalize modlist needed for the current world.
Definition: init.cpp:872
void reset_sounds()
Definition: sounds.cpp:565

References achievements_tracker_ptr, active_npc, calendar::before_time_starts, bVMonsterLookFire, character_id, explosion_handler::explosion_queue::clear(), stats_tracker::clear(), mission::clear_all(), Messages::clear_messages(), clear_zombies(), coming_to_stairs, debugmsg, faction_manager_ptr, follower_ids, explosion_handler::get_explosion_queue(), get_weather, get_world_base_save_path(), kill_tracker_ptr, init::load_world_modfiles(), m, new_game, next_mission_id, next_npc_id, weather_manager::nextweather, string_id< weather_type >::NULL_ID(), QUIT_NO, remoteveh_cache, remoteveh_cache_time, scent_map::reset(), sounds::reset_sounds(), SAVE_ARTIFACTS(), scent, SCT, calendar::set_eternal_season(), calendar::set_season_length(), stats(), timed_events, token_provider_ptr, turnssincelastmon, uquit, scrollingcombattext::vSCT, and weather_manager::weather_id.

Referenced by butcher_submenu(), and quickload().

◆ shared_from()

template<typename T >
template shared_ptr_fast< npc > game::shared_from< npc > ( const T &  critter)

Returns a shared pointer to the given critter (which can be of any of the subclasses of Creature).

The function may return an empty pointer if the given critter is not stored anywhere (e.g. it was allocated on the stack, not stored in the critter_tracker nor in active_npc nor is it u).

Definition at line 4542 of file game.cpp.

4543{
4544 if( static_cast<const Creature *>( &critter ) == static_cast<const Creature *>( &u ) ) {
4545 // u is not stored in a shared_ptr, but it won't go out of scope anyway
4546 return std::dynamic_pointer_cast<T>( u_shared_ptr );
4547 }
4548 if( critter.is_monster() ) {
4549 if( const shared_ptr_fast<monster> mon_ptr = critter_tracker->find( critter.pos() ) ) {
4550 if( static_cast<const Creature *>( mon_ptr.get() ) == static_cast<const Creature *>( &critter ) ) {
4551 return std::dynamic_pointer_cast<T>( mon_ptr );
4552 }
4553 }
4554 }
4555 if( critter.is_npc() ) {
4556 for( auto &cur_npc : active_npc ) {
4557 if( static_cast<const Creature *>( cur_npc.get() ) == static_cast<const Creature *>( &critter ) ) {
4558 return std::dynamic_pointer_cast<T>( cur_npc );
4559 }
4560 }
4561 }
4562 return nullptr;
4563}

References active_npc, critter_tracker, u, and u_shared_ptr.

Referenced by list_monsters(), mon_info_update(), and validate_mounted_npcs().

◆ shift_destination_preview()

void game::shift_destination_preview ( const point delta)

Definition at line 11974 of file game.cpp.

11975{
11976 for( tripoint &p : destination_preview ) {
11977 p += delta;
11978 }
11979}

References destination_preview.

◆ shift_monsters()

void game::shift_monsters ( const tripoint shift)
private

Shift all active monsters, the shift vector is the number of shifted submaps.

Monsters that are outside of the reality bubble after shifting are despawned. Note on z-levels: this works with vertical shifts, but currently all monsters are despawned upon a vertical shift.

Definition at line 10977 of file game.cpp.

10978{
10979 // If either shift argument is non-zero, we're shifting.
10980 if( shift == tripoint_zero ) {
10981 return;
10982 }
10983 for( monster &critter : all_monsters() ) {
10984 if( shift.xy() != point_zero ) {
10985 critter.shift( shift.xy() );
10986 }
10987
10988 if( m.inbounds( critter.pos() ) && ( shift.z == 0 || m.has_zlevels() ) ) {
10989 // We're inbounds, so don't despawn after all.
10990 // No need to shift Z-coordinates, they are absolute
10991 continue;
10992 }
10993 // Either a vertical shift or the critter is now outside of the reality bubble,
10994 // anyway: it must be saved and removed.
10995 despawn_monster( critter );
10996 }
10997 // The order in which zombies are shifted may cause zombies to briefly exist on
10998 // the same square. This messes up the mon_at cache, so we need to rebuild it.
10999 critter_tracker->rebuild_cache();
11000}

References all_monsters(), critter_tracker, despawn_monster(), map::has_zlevels(), map::inbounds(), m, point_zero, tripoint_zero, tripoint::xy(), and tripoint::z.

Referenced by update_map(), vertical_move(), and vertical_shift().

◆ slip_down()

bool game::slip_down ( )

Checks if player is able to successfully climb to/from some terrain and not slip down.

Returns
whether player has slipped down
Dexterity decreases chances of slipping while climbing

Definition at line 11981 of file game.cpp.

11982{
11983 ///\EFFECT_DEX decreases chances of slipping while climbing
11984 int climb = u.dex_cur;
11985 if( u.has_trait( trait_BADKNEES ) ) {
11986 climb = climb / 2;
11987 }
11988 if( one_in( climb ) ) {
11989 add_msg( m_bad, _( "You slip while climbing and fall down again." ) );
11990 if( climb <= 1 ) {
11991 add_msg( m_bad, _( "Climbing is impossible in your current state." ) );
11992 }
11993 return true;
11994 }
11995 return false;
11996}
static const trait_id trait_BADKNEES("BADKNEES")

References _, add_msg(), Character::dex_cur, Character::has_trait(), m_bad, one_in(), trait_BADKNEES, and u.

◆ spawn_hallucination()

bool game::spawn_hallucination ( const tripoint p)

Spawns a hallucination at a determined position.

Attempts to spawn a hallucination at given location.

Returns false if the hallucination couldn't be spawned for whatever reason, such as a monster already in the target square.

Returns
Whether or not a hallucination was successfully spawned.

Definition at line 4700 of file game.cpp.

4701{
4702 if( one_in( 100 ) ) {
4703 shared_ptr_fast<npc> tmp = make_shared_fast<npc>();
4704 tmp->normalize();
4705 tmp->randomize( NC_HALLU );
4706 tmp->spawn_at_precise( { get_levx(), get_levy() }, p );
4707 if( !critter_at( p, true ) ) {
4709 load_npcs();
4710 return true;
4711 } else {
4712 return false;
4713 }
4714 }
4715
4717 const shared_ptr_fast<monster> phantasm = make_shared_fast<monster>( mt );
4718 phantasm->hallucination = true;
4719 phantasm->spawn( p );
4720
4721 //Don't attempt to place phantasms inside of other creatures
4722 if( !critter_at( phantasm->pos(), true ) ) {
4723 return critter_tracker->add( phantasm );
4724 } else {
4725 return false;
4726 }
4727}
mtype_id get_valid_hallucination() const
static MonsterGenerator & generator()
npc_class_id NC_HALLU("NC_HALLU")

References critter_at(), critter_tracker, MonsterGenerator::generator(), get_levx(), get_levy(), MonsterGenerator::get_valid_hallucination(), overmapbuffer::insert_npc(), load_npcs(), NC_HALLU, one_in(), and overmap_buffer.

◆ spell_events_subscriber()

spell_events & game::spell_events_subscriber ( )

Definition at line 2714 of file game.cpp.

2715{
2716 return *spell_events_ptr;
2717}

References spell_events_ptr.

◆ start_calendar()

void game::start_calendar ( )

Definition at line 11541 of file game.cpp.

11542{
11543 const bool scen_season = scen->has_flag( "SPR_START" ) || scen->has_flag( "SUM_START" ) ||
11544 scen->has_flag( "AUT_START" ) || scen->has_flag( "WIN_START" ) ||
11545 scen->has_flag( "SUM_ADV_START" );
11546
11548 if( scen_season ) {
11549 // Configured starting date overridden by scenario, calendar_config.start is left as Spring 1
11551 get_option<int>( "INITIAL_TIME" );
11552 calendar_config._start_of_game = calendar::turn_zero + 1_hours * get_option<int>( "INITIAL_TIME" );
11553 if( scen->has_flag( "SPR_START" ) ) {
11555 } else if( scen->has_flag( "SUM_START" ) ) {
11558 } else if( scen->has_flag( "AUT_START" ) ) {
11561 } else if( scen->has_flag( "WIN_START" ) ) {
11564 } else if( scen->has_flag( "SUM_ADV_START" ) ) {
11567 } else {
11568 debugmsg( "The Unicorn" );
11569 }
11570 } else {
11571 // No scenario, so use the starting date+time configured in world options
11572 int initial_days = get_option<int>( "INITIAL_DAY" );
11573 if( initial_days == -1 ) {
11574 // 0 - 363 for a 91 day season
11575 initial_days = rng( 0, get_option<int>( "SEASON_LENGTH" ) * 4 - 1 );
11576 }
11578
11579 // Determine the season based off how long the seasons are set to be
11580 // First take the number of season elapsed up to the starting date, then mod by 4 to get the season of the current year
11581 const int season_number = ( initial_days / get_option<int>( "SEASON_LENGTH" ) ) % 4;
11582 if( season_number == 0 ) {
11584 } else if( season_number == 1 ) {
11586 } else if( season_number == 2 ) {
11588 } else {
11590 }
11591
11593 + 1_hours * get_option<int>( "INITIAL_TIME" )
11594 + 1_days * get_option<int>( "SPAWN_DELAY" );
11595 }
11596
11598}
@ WINTER
Definition: calendar.h:21
@ AUTUMN
Definition: calendar.h:20
@ SUMMER
Definition: calendar.h:19
@ SPRING
Definition: calendar.h:18
time_duration season_length() const
Definition: calendar.h:569
const scenario * scen
Definition: game.h:982
bool has_flag(const std::string &flag) const
Such as a seasonal start, fiery start, surrounded start, etc.
Definition: scenario.cpp:439

References calendar_config::_initial_season, calendar_config::_start_of_cataclysm, calendar_config::_start_of_game, AUTUMN, calendar::config, debugmsg, scenario::has_flag(), rng(), scen, calendar_config::season_length(), SPRING, SUMMER, calendar::turn, calendar::turn_zero, and WINTER.

Referenced by start_game().

◆ start_game()

bool game::start_game ( )
private

Definition at line 550 of file game.cpp.

551{
552 if( !gamemode ) {
553 gamemode = std::make_unique<special_game>();
554 }
555
556 seed = rng_bits();
557 new_game = true;
560 safe_mode = ( get_option<bool>( "SAFEMODE" ) ? SAFE_MODE_ON : SAFE_MODE_OFF );
561 mostseen = 0; // ...and mostseen is 0, we haven't seen any monsters yet.
564
566
569 popup.message( "%s", _( "Please wait as we build your world" ) );
572
573 load_master();
574 u.setID( assign_npc_id() ); // should be as soon as possible, but *after* load_master
575
579 do {
580 omtstart = start_loc.find_player_initial_location();
581 if( omtstart == overmap::invalid_tripoint ) {
582 if( query_yn(
583 _( "Try again?\n\nIt may require several attempts until the game finds a valid starting location." ) ) ) {
586 } else {
587 return false;
588 }
589 }
590 } while( omtstart == overmap::invalid_tripoint );
591
592 start_loc.prepare_map( omtstart );
593
594 // Place vehicles spawned by scenario or profession, has to be placed very early to avoid bugs.
595 if( u.starting_vehicle &&
596 !place_vehicle_nearby( u.starting_vehicle, omtstart.xy(), 0, 30,
597 std::vector<std::string> {} ) ) {
598 debugmsg( "could not place starting vehicle" );
599 }
600
601 if( scen->has_map_extra() ) {
602 // Map extras can add monster spawn points and similar and should be done before the main
603 // map is loaded.
604 start_loc.add_map_extra( omtstart, scen->get_map_extra() );
605 }
606
607 // TODO: fix point types
608 tripoint lev = project_to<coords::sm>( omtstart ).raw();
609 // The player is centered in the map, but lev[xyz] refers to the top left point of the map
610 lev.x -= HALF_MAPSIZE;
611 lev.y -= HALF_MAPSIZE;
612 load_map( lev, /*pump_events=*/true );
613
616 // Do this after the map cache has been built!
617 start_loc.place_player( u );
618 // ...but then rebuild it, because we want visibility cache to avoid spawning monsters in sight
621 // Start the overmap with out immediate neighborhood visible, this needs to be after place_player
623 get_option<int>( "DISTANCE_INITIAL_VISIBILITY" ), 0 );
624
625 u.moves = 0;
626 u.process_turn(); // process_turn adds the initial move points
630 u.next_climate_control_check = calendar::before_time_starts; // Force recheck at startup
632
633 //Reset character safe mode/pickup rules
638
639 //Put some NPCs in there!
640 if( get_option<std::string>( "STARTING_NPC" ) == "always" ||
641 ( get_option<std::string>( "STARTING_NPC" ) == "scenario" &&
642 !g->scen->has_flag( "LONE_START" ) ) ) {
644 }
645 //Load NPCs. Set nearby npcs to active.
646 load_npcs();
647 // Spawn the monsters
648 const bool spawn_near =
649 get_option<bool>( "BLACK_ROAD" ) || g->scen->has_flag( "SUR_START" );
650 // Surrounded start ones
651 if( spawn_near ) {
652 start_loc.surround_with_monsters( omtstart, mongroup_id( "GROUP_ZOMBIE" ), 70 );
653 }
654
655 m.spawn_monsters( !spawn_near ); // Static monsters
656
657 // Make sure that no monsters are near the player
658 // This can happen in lab starts
659 if( !spawn_near ) {
660 for( monster &critter : all_monsters() ) {
661 if( rl_dist( critter.pos(), u.pos() ) <= 5 ||
662 m.clear_path( critter.pos(), u.pos(), 40, 1, 100 ) ) {
663 remove_zombie( critter );
664 }
665 }
666 }
667
668 //Create mutation_category_level
670 //Calculate mutation drench protection stats
673 if( scen->has_flag( "FIRE_START" ) ) {
674 start_loc.burn( omtstart, 3, 3 );
675 }
676 if( scen->has_flag( "INFECTED" ) ) {
678 }
679 if( scen->has_flag( "BAD_DAY" ) ) {
680 u.add_effect( effect_flu, 1000_minutes );
681 u.add_effect( effect_drunk, 270_minutes );
682 u.add_morale( MORALE_FEELING_BAD, -100, -100, 50_minutes, 50_minutes );
683 }
684 if( scen->has_flag( "HELI_CRASH" ) ) {
685 start_loc.handle_heli_crash( u );
686 bool success = false;
687 for( auto v : m.get_vehicles() ) {
688 std::string name = v.v->type.str();
689 std::string search = std::string( "helicopter" );
690 if( name.find( search ) != std::string::npos ) {
691 for( const vpart_reference &vp : v.v->get_any_parts( VPFLAG_CONTROLS ) ) {
692 const tripoint pos = vp.pos();
693 u.setpos( pos );
694
695 // Delete the items that would have spawned here from a "corpse"
696 for( auto sp : v.v->parts_at_relative( vp.mount(), true ) ) {
697 vehicle_stack here = v.v->get_items( sp );
698
699 for( auto iter = here.begin(); iter != here.end(); ) {
700 iter = here.erase( iter );
701 }
702 }
703
704 auto mons = critter_tracker->find( pos );
705 if( mons != nullptr ) {
706 critter_tracker->remove( *mons );
707 }
708
709 success = true;
710 break;
711 }
712 if( success ) {
713 v.v->name = "Bird Wreckage";
714 break;
715 }
716 }
717 }
718 }
719 if( scen->has_flag( "BORDERED" ) ) {
720 overmap &starting_om = get_cur_om();
721 for( int z = -OVERMAP_DEPTH; z <= OVERMAP_HEIGHT; z++ ) {
722 starting_om.place_special_forced( overmap_special_id( "world" ), { 0, 0, z },
724 }
725
726 }
727 for( auto &e : u.inv_dump() ) {
728 e->set_owner( g->u );
729 }
730 // Now that we're done handling coordinates, ensure the player's submap is in the center of the map
731 update_map( u );
732 // Profession pets
733 for( const mtype_id &elem : u.starting_pets ) {
734 if( monster *const mon = place_critter_around( elem, u.pos(), 5 ) ) {
735 mon->friendly = -1;
736 mon->add_effect( effect_pet, 1_turns, num_bp );
737 } else {
738 add_msg( m_debug, "cannot place starting pet, no space!" );
739 }
740 }
741 // Assign all of this scenario's missions to the player.
742 for( const mission_type_id &m : scen->missions() ) {
743 const auto mission = mission::reserve_new( m, character_id() );
744 mission->assign( u );
745 }
746
747 g->events().send<event_type::game_start>( u.getID() );
748 return true;
749}
body_part random_body_part(bool main_parts_only)
Returns a random body_part token.
Definition: bodypart.cpp:364
bool last_climate_control_ret
Definition: character.h:2248
void drench_mut_calc()
Recalculates mutation drench protection for all bodyparts (ignored/good/neutral stats)
Definition: character.cpp:7859
void set_stamina(int new_stamina)
Definition: character.cpp:7120
time_point next_climate_control_check
Definition: character.h:2247
int get_stamina_max() const
Definition: character.cpp:7111
void set_highest_cat_level()
Recalculates mutation_category_level[] values for the player.
Definition: character.cpp:7836
void default_initialize()
Perform default initialization.
Definition: auto_note.cpp:101
void start_calendar()
Definition: game.cpp:11541
void create_starting_npcs()
Definition: game.cpp:877
overmap & get_cur_om() const
The overmap which contains the center submap of the reality bubble.
Definition: game.cpp:11841
vehicle * place_vehicle_nearby(const vproto_id &id, const point_abs_omt &origin, int min_distance, int max_distance, const std::vector< std::string > &omt_search_types={})
Definition: game.cpp:751
bool clear_path(const tripoint &f, const tripoint &t, int range, int cost_min, int cost_max) const
Check whether there's a direct line of sight between F and T with the additional movecost restraints.
Definition: map.cpp:6409
static mission * reserve_new(const mission_type_id &type, const character_id &npc_id)
Create a new mission of the given type and assign it to the given npc.
Definition: mission.cpp:64
void assign(avatar &u)
Assigns the mission to the player.
Definition: mission.cpp:210
void place_special_forced(const overmap_special_id &special_id, const tripoint_om_omt &p, om_direction::type dir)
Definition: overmap.cpp:2164
bool reveal(const point_abs_omt &center, int radius, int z)
Mark a square area around center on Z-level z as seen.
bool random_start_location
Definition: player.h:468
vproto_id starting_vehicle
Definition: player.h:480
std::vector< mtype_id > starting_pets
Definition: player.h:481
start_location_id start_location
Definition: player.h:469
void clear_character_rules()
bool has_map_extra() const
Definition: scenario.cpp:454
const std::string & get_map_extra() const
Definition: scenario.cpp:458
const std::vector< mission_type_id > & missions() const
Definition: scenario.cpp:462
start_location_id random_start_location() const
Definition: scenario.cpp:232
void burn(const tripoint_abs_omt &omtstart, size_t count, int rad) const
Burn random terrain / furniture with FLAMMABLE or FLAMMABLE_ASH tag.
void surround_with_monsters(const tripoint_abs_omt &omtstart, const mongroup_id &type, float expected_points) const
Adds surround start monsters.
void prepare_map(const tripoint_abs_omt &omtstart) const
Initialize the map at players start location using prepare_map.
void place_player(player &u) const
Place the player somewhere in the reality bubble (g->m).
void handle_heli_crash(player &u) const
tripoint_abs_omt find_player_initial_location() const
Find a suitable start location on the overmap.
void add_map_extra(const tripoint_abs_omt &omtstart, const std::string &map_extra) const
Adds a map extra, see map_extras.h and map_extras.cpp.
const T & obj() const
Returns the actual object this id refers to.
Definition: achievement.cpp:58
iterator erase(const_iterator it) override
Definition: vehicle.cpp:230
static const efftype_id effect_drunk("drunk")
static const efftype_id effect_infected("infected")
static const efftype_id effect_accumulated_mutagen("accumulated_mutagen")
static const efftype_id effect_flu("flu")
static constexpr int SPRING_TEMPERATURE
Base starting spring temperature in F used for climate, weather and temperature calculation.
void update_weather()
Definition: weather.cpp:1056
const morale_type MORALE_FEELING_BAD("morale_feeling_bad")
static bool search(const ui_adaptor &om_ui, tripoint_abs_omt &curs, const tripoint_abs_omt &orig)
unsigned int rng_bits()
Definition: rng.cpp:12
string_id< overmap_special > overmap_special_id
Definition: type_id.h:134
string_id< MonsterGroup > mongroup_id
Definition: type_id.h:105
@ VPFLAG_CONTROLS
Definition: veh_type.h:41

References _, Creature::add_effect(), start_location::add_map_extra(), Character::add_morale(), add_msg(), all_monsters(), mission::assign(), assign_npc_id(), calendar::before_time_starts, item_stack::begin(), map::build_map_cache(), start_location::burn(), character_id, auto_notes::auto_note_settings::clear(), overmapbuffer::clear(), auto_pickup::player_settings::clear_character_rules(), safemode::clear_character_rules(), map::clear_path(), create_starting_npcs(), critter_tracker, debugmsg, auto_notes::auto_note_settings::default_initialize(), Character::drench_mut_calc(), effect_accumulated_mutagen, effect_drunk, effect_flu, effect_infected, effect_pet, item_stack::end(), vehicle_stack::erase(), start_location::find_player_initial_location(), g, game_start, gamemode, get_auto_notes_settings(), get_auto_pickup(), get_cur_om(), get_distraction_manager(), get_levz(), scenario::get_map_extra(), get_safemode(), Character::get_stamina_max(), map::get_vehicles(), get_weather, Character::getID(), Character::global_omt_location(), HALF_MAPSIZE, start_location::handle_heli_crash(), scenario::has_flag(), scenario::has_map_extra(), init_autosave(), Character::inv_dump(), overmap::invalid_tripoint, map::invalidate_map_cache(), Character::last_climate_control_ret, distraction_manager::distraction_manager_gui::load(), safemode::load_global(), load_map(), load_master(), load_npcs(), m, m_debug, MAPBUFFER, scenario::missions(), MORALE_FEELING_BAD, mostseen, Creature::moves, om_direction::name(), new_game, Character::next_climate_control_check, weather_manager::nextweather, om_direction::north, num_bp, string_id< T >::obj(), overmap_buffer, OVERMAP_DEPTH, OVERMAP_HEIGHT, place_critter_around(), start_location::place_player(), overmap::place_special_forced(), place_vehicle_nearby(), popup(), Character::pos(), start_location::prepare_map(), Character::process_turn(), query_yn(), random_body_part(), player::random_start_location, scenario::random_start_location(), ui_manager::redraw(), refresh_display(), remove_zombie(), mission::reserve_new(), mapbuffer::reset(), overmapbuffer::reveal(), rl_dist(), rng_bits(), safe_mode, SAFE_MODE_OFF, SAFE_MODE_ON, scen, overmap_ui::search(), seed, Character::set_highest_cat_level(), Character::set_stamina(), Character::setID(), Character::setpos(), map::spawn_monsters(), SPRING_TEMPERATURE, start_calendar(), player::start_location, player::starting_pets, player::starting_vehicle, behavior::success, start_location::surround_with_monsters(), weather_manager::temperature, calendar::turn, u, update_map(), weather_manager::update_weather(), VPFLAG_CONTROLS, tripoint::x, coords::coord_point< Point, Origin, Scale >::xy(), and tripoint::y.

◆ start_hauling()

void game::start_hauling ( const tripoint pos)

Definition at line 10340 of file game.cpp.

10341{
10342 // Find target items and quantities thereof for the new activity
10343 std::vector<item_location> target_items;
10344 std::vector<int> quantities;
10345
10346 map_stack items = m.i_at( pos );
10347 for( item &it : items ) {
10348 // Liquid cannot be picked up
10349 if( it.made_of( LIQUID ) ) {
10350 continue;
10351 }
10352 target_items.emplace_back( map_cursor( pos ), &it );
10353 // Quantity of 0 means move all
10354 quantities.push_back( 0 );
10355 }
10356
10357 if( target_items.empty() ) {
10358 // Nothing to haul
10359 return;
10360 }
10361
10362 // Whether the destination is inside a vehicle (not supported)
10363 const bool to_vehicle = false;
10364 // Destination relative to the player
10365 const tripoint relative_destination{};
10366
10368 target_items,
10369 quantities,
10370 to_vehicle,
10371 relative_destination
10372 ) ) );
10373}

References Character::assign_activity(), map::i_at(), LIQUID, m, and u.

Referenced by vertical_move(), and walk_move().

◆ stats()

stats_tracker & game::stats ( )

Definition at line 2704 of file game.cpp.

2705{
2706 return *stats_tracker_ptr;
2707}

References stats_tracker_ptr.

Referenced by death_screen(), handle_action(), setup(), and win().

◆ swap_critters()

bool game::swap_critters ( Creature a,
Creature b 
)

Swaps positions of two creatures.

Definition at line 4729 of file game.cpp.

4730{
4731 if( &a == &b ) {
4732 // No need to do anything, but print a debugmsg anyway
4733 debugmsg( "Tried to swap %s with itself", a.disp_name() );
4734 return true;
4735 }
4736 if( critter_at( a.pos() ) != &a ) {
4737 debugmsg( "Tried to swap when it would cause a collision between %s and %s.",
4738 b.disp_name(), critter_at( a.pos() )->disp_name() );
4739 return false;
4740 }
4741 if( critter_at( b.pos() ) != &b ) {
4742 debugmsg( "Tried to swap when it would cause a collision between %s and %s.",
4743 a.disp_name(), critter_at( b.pos() )->disp_name() );
4744 return false;
4745 }
4746 // Simplify by "sorting" the arguments
4747 // Only the first argument can be u
4748 // If swapping player/npc with a monster, monster is second
4749 bool a_first = a.is_player() ||
4750 ( a.is_npc() && !b.is_player() );
4751 Creature &first = a_first ? a : b;
4752 Creature &second = a_first ? b : a;
4753 // Possible options:
4754 // both first and second are monsters
4755 // second is a monster, first is a player or an npc
4756 // first is a player, second is an npc
4757 // both first and second are npcs
4758 if( first.is_monster() ) {
4759 monster *m1 = dynamic_cast< monster * >( &first );
4760 monster *m2 = dynamic_cast< monster * >( &second );
4761 if( m1 == nullptr || m2 == nullptr || m1 == m2 ) {
4762 debugmsg( "Couldn't swap two monsters" );
4763 return false;
4764 }
4765
4766 critter_tracker->swap_positions( *m1, *m2 );
4767 return true;
4768 }
4769
4770 player *u_or_npc = dynamic_cast< player * >( &first );
4771 player *other_npc = dynamic_cast< player * >( &second );
4772
4773 if( u_or_npc->in_vehicle ) {
4774 m.unboard_vehicle( u_or_npc->pos() );
4775 }
4776
4777 if( other_npc && other_npc->in_vehicle ) {
4778 m.unboard_vehicle( other_npc->pos() );
4779 }
4780
4781 tripoint temp = second.pos();
4782 second.setpos( first.pos() );
4783
4784 if( first.is_player() ) {
4785 walk_move( temp );
4786 } else {
4787 first.setpos( temp );
4788 if( m.veh_at( u_or_npc->pos() ).part_with_feature( VPFLAG_BOARDABLE, true ) ) {
4789 m.board_vehicle( u_or_npc->pos(), u_or_npc );
4790 }
4791 }
4792
4793 if( other_npc && m.veh_at( other_npc->pos() ).part_with_feature( VPFLAG_BOARDABLE, true ) ) {
4794 m.board_vehicle( other_npc->pos(), other_npc );
4795 }
4796 return true;
4797}
virtual bool is_monster() const
Definition: creature.h:101
virtual bool is_player() const
Definition: creature.h:92
virtual void setpos(const tripoint &pos)=0
bool walk_move(const tripoint &dest, bool via_ramp=false)
Definition: game.cpp:8719
constexpr double a
Definition: magic.cpp:1030
constexpr double b
Definition: magic.cpp:1031
@ VPFLAG_BOARDABLE
Definition: veh_type.h:39

References a, b, map::board_vehicle(), critter_at(), critter_tracker, debugmsg, Character::in_vehicle, Creature::is_monster(), Creature::is_player(), m, optional_vpart_position::part_with_feature(), Creature::pos(), Character::pos(), second, Creature::setpos(), map::unboard_vehicle(), map::veh_at(), VPFLAG_BOARDABLE, and walk_move().

Referenced by npc_menu().

◆ take_screenshot() [1/2]

bool game::take_screenshot ( ) const

Saves a screenshot of the current viewport, as a PNG file.

Filesystem location is derived from the current world and character.

Note
: Only works for SDL/TILES (otherwise the function returns false). A window (more precisely, a viewport) must already exist and the SDL renderer must be valid.
Returns
true if the screenshot generation was successful, false otherwise.

Definition at line 7109 of file game.cpp.

7110{
7111 popup( _( "This binary was not compiled with tiles support." ) );
7112 return false;
7113}

References _, and popup().

Referenced by do_turn().

◆ take_screenshot() [2/2]

bool game::take_screenshot ( const std::string &  file_path) const

Saves a screenshot of the current viewport, as a PNG file, to the given location.

Parameters
file_pathA full path to the file where the screenshot should be saved.
Note
: Only works for SDL/TILES (otherwise the function returns false). A window (more precisely, a viewport) must already exist and the SDL renderer must be valid.
Returns
true if the screenshot generation was successful, false otherwise.

Definition at line 7103 of file game.cpp.

7104{
7105 popup( _( "This binary was not compiled with tiles support." ) );
7106 return false;
7107}

References _, and popup().

◆ temp_exit_fullscreen()

void game::temp_exit_fullscreen ( )

Definition at line 449 of file game.cpp.

450{
451 if( fullscreen ) {
452 was_fullscreen = true;
454 } else {
455 was_fullscreen = false;
456 }
457}

References fullscreen, toggle_fullscreen(), and was_fullscreen.

Referenced by list_items_monsters(), and look_around().

◆ toggle_debug_hour_timer()

void game::toggle_debug_hour_timer ( )

Definition at line 11148 of file game.cpp.

11149{
11151}

References game::debug_hour_timer::toggle().

Referenced by handle_action(), and look_around().

◆ toggle_fullscreen()

void game::toggle_fullscreen ( )

Definition at line 402 of file game.cpp.

403{
404#if !defined(TILES)
407#else
408 toggle_fullscreen_window();
409#endif
410}

References fullscreen, and mark_main_ui_adaptor_resize().

Referenced by handle_action(), reenter_fullscreen(), and temp_exit_fullscreen().

◆ toggle_gate()

void game::toggle_gate ( const tripoint p)

Definition at line 5099 of file game.cpp.

5100{
5101 gates::toggle_gate( p, u );
5102}
void toggle_gate(const tripoint &pos, player &p)
opens/closes the gate via player's activity
Definition: gates.cpp:236

References gates::toggle_gate(), and u.

◆ toggle_pixel_minimap()

void game::toggle_pixel_minimap ( )

Definition at line 412 of file game.cpp.

413{
414#if defined(TILES)
416 clear_window_area( w_pixel_minimap );
417 }
420#endif // TILES
421}

References mark_main_ui_adaptor_resize(), pixel_minimap_option, and w_pixel_minimap.

Referenced by handle_action(), and look_around().

◆ try_get_left_click_action()

bool game::try_get_left_click_action ( action_id act,
const tripoint mouse_target 
)
private

Definition at line 2289 of file game.cpp.

2290{
2291 bool new_destination = true;
2292 if( !destination_preview.empty() ) {
2293 auto &final_destination = destination_preview.back();
2294 if( final_destination.x == mouse_target.x && final_destination.y == mouse_target.y ) {
2295 // Second click
2296 new_destination = false;
2298 destination_preview.clear();
2300 if( act == ACTION_NULL ) {
2301 // Something went wrong
2303 return false;
2304 }
2305 }
2306 }
2307
2308 if( new_destination ) {
2310 u.get_path_avoid() );
2311 return false;
2312 }
2313
2314 return true;
2315}

References act, ACTION_NULL, Character::clear_destination(), destination_preview, Character::get_next_auto_move_direction(), Character::get_path_avoid(), Character::get_pathfinding_settings(), m, Character::pos(), map::route(), Character::set_destination(), u, tripoint::x, and tripoint::y.

Referenced by handle_action().

◆ try_get_right_click_action()

bool game::try_get_right_click_action ( action_id act,
const tripoint mouse_target 
)
private

Definition at line 2317 of file game.cpp.

2318{
2319 const bool cleared_destination = !destination_preview.empty();
2321 destination_preview.clear();
2322
2323 if( cleared_destination ) {
2324 // Produce no-op if auto-move had just been cleared on this action
2325 // e.g. from a previous single left mouse click. This has the effect
2326 // of right-click canceling an auto-move before it is initiated.
2327 return false;
2328 }
2329
2330 const bool is_adjacent = square_dist( mouse_target.xy(), point( u.posx(), u.posy() ) ) <= 1;
2331 const bool is_self = square_dist( mouse_target.xy(), point( u.posx(), u.posy() ) ) <= 0;
2332 if( const monster *const mon = critter_at<monster>( mouse_target ) ) {
2333 if( !u.sees( *mon ) ) {
2334 add_msg( _( "Nothing relevant here." ) );
2335 return false;
2336 }
2337
2338 if( !u.weapon.is_gun() ) {
2339 add_msg( m_info, _( "You are not wielding a ranged weapon." ) );
2340 return false;
2341 }
2342
2343 // TODO: Add weapon range check. This requires weapon to be reloaded.
2344
2345 act = ACTION_FIRE;
2346 } else if( is_adjacent &&
2347 m.close_door( tripoint( mouse_target.xy(), u.posz() ), !m.is_outside( u.pos() ),
2348 true ) ) {
2349 act = ACTION_CLOSE;
2350 } else if( is_self ) {
2352 } else if( is_adjacent ) {
2354 } else {
2355 add_msg( _( "Nothing relevant here." ) );
2356 return false;
2357 }
2358
2359 return true;
2360}
bool close_door(const tripoint &p, bool inside, bool check_only)
Definition: map.cpp:3974
static bool is_adjacent(const monster &z, const Creature &target)

References _, act, ACTION_CLOSE, ACTION_EXAMINE, ACTION_FIRE, ACTION_PICKUP, add_msg(), Character::clear_destination(), map::close_door(), destination_preview, is_adjacent(), item::is_gun(), map::is_outside(), m, m_info, Character::pos(), Character::posx(), Character::posy(), Character::posz(), Character::sees(), square_dist(), u, Character::weapon, and tripoint::xy().

Referenced by handle_action().

◆ unload_npcs()

void game::unload_npcs ( )
private

Unloads all NPCs.

If you call this you must later call load_npcs, lest caches get rather confused. The tests used to call this a lot when they shouldn't. It is now private to reduce the chance of similar problems in the future.

Definition at line 855 of file game.cpp.

856{
857 for( const auto &npc : active_npc ) {
858 npc->on_unload();
859 }
860
861 active_npc.clear();
862}
void on_unload()
Do some cleanup and caching as npc is being unloaded from map.
Definition: npc.cpp:2645

References active_npc, and npc::on_unload().

Referenced by place_player_overmap(), and reload_npcs().

◆ unserialize()

void game::unserialize ( std::istream &  fin)

Definition at line 167 of file savegame.cpp.

168{
169 chkversion( fin );
170 int tmpturn = 0;
171 int tmpcalstart = 0;
172 int tmprun = 0;
173 tripoint lev;
174 point com;
175 JsonIn jsin( fin );
176 try {
177 JsonObject data = jsin.get_object();
178
179 data.read( "turn", tmpturn );
180 data.read( "calendar_start", tmpcalstart );
182 calendar_config._initial_season = static_cast<season_type>( data.get_int( "initial_season",
183 static_cast<int>( SPRING ) ) );
184 // 0.E stable
185 if( savegame_loading_version < 26 ) {
186 tmpturn *= 6;
187 tmpcalstart *= 6;
188 }
191 tmpcalstart );
192
193 if( !data.read( "game_start", calendar_config._start_of_game ) ) {
195 }
196
197 data.read( "auto_travel_mode", auto_travel_mode );
198 data.read( "run_mode", tmprun );
199 data.read( "mostseen", mostseen );
200 data.read( "levx", lev.x );
201 data.read( "levy", lev.y );
202 data.read( "levz", lev.z );
203 data.read( "om_x", com.x );
204 data.read( "om_y", com.y );
205
206 load_map(
207 tripoint( lev.x + com.x * OMAPX * 2, lev.y + com.y * OMAPY * 2, lev.z ),
208 /*pump_events=*/true
209 );
210
211 safe_mode = static_cast<safe_mode_type>( tmprun );
212 if( get_option<bool>( "SAFEMODE" ) && safe_mode == SAFE_MODE_OFF ) {
214 }
215
216 std::string linebuff;
217 std::string linebuf;
218 if( data.read( "grscent", linebuf ) && data.read( "typescent", linebuff ) ) {
219 scent.deserialize( linebuf );
220 scent.deserialize( linebuff, true );
221 } else {
222 scent.reset();
223 }
224 data.read( "active_monsters", *critter_tracker );
225
226 coming_to_stairs.clear();
227 for( auto elem : data.get_array( "stair_monsters" ) ) {
228 monster stairtmp;
229 elem.read( stairtmp );
230 coming_to_stairs.push_back( stairtmp );
231 }
232
233 if( data.has_object( "kill_tracker" ) ) {
234 data.read( "kill_tracker", *kill_tracker_ptr );
235 } else {
236 // Legacy support for when kills were stored directly in game
237 std::map<mtype_id, int> kills;
238 std::vector<std::string> npc_kills;
239 for( const JsonMember member : data.get_object( "kills" ) ) {
240 kills[mtype_id( member.name() )] = member.get_int();
241 }
242
243 for( const std::string npc_name : data.get_array( "npc_kills" ) ) {
244 npc_kills.push_back( npc_name );
245 }
246
247 kill_tracker_ptr->reset( kills, npc_kills );
248 }
249
250 data.read( "player", u );
252 data.read( "stats_tracker", *stats_tracker_ptr );
253 data.read( "achievements_tracker", *achievements_tracker_ptr );
254 data.read( "token_provider", token_provider_ptr );
256 Messages::deserialize( data );
257
258 } catch( const JsonError &jsonerr ) {
259 debugmsg( "Bad save json\n%s", jsonerr.c_str() );
260 return;
261 }
262}
season_type
Real world seasons.
Definition: calendar.h:17
Represents a member of a JsonObject.
Definition: json.h:1249
JsonObject get_object(const std::string &name) const
Definition: json.cpp:361
bool has_object(const std::string &name) const
Definition: json.cpp:425
JsonArray get_array(const std::string &name) const
Definition: json.cpp:332
int get_int(const std::string &name) const
Definition: json.cpp:282
bool read(const std::string &name, T &t, bool throw_on_error=true) const
Definition: json.h:944
void deserialize(const std::string &data, bool is_type=false)
Definition: savegame.cpp:264
safe_mode_type
Definition: game.h:76
static constexpr int OMAPY
static constexpr int OMAPX
Size of the overmap.
void deserialize(const JsonObject &json)
Definition: messages.cpp:330
std::string member
Definition: mapgen.cpp:410
static void chkversion(std::istream &fin)
Definition: savegame.cpp:148
int savegame_loading_version
Definition: savegame.cpp:64

References calendar_config::_initial_season, calendar_config::_start_of_cataclysm, calendar_config::_start_of_game, achievements_tracker_ptr, auto_travel_mode, JsonError::c_str(), chkversion(), coming_to_stairs, calendar::config, critter_tracker, debugmsg, Messages::deserialize(), scent_map::deserialize(), time_duration::from_turns(), JsonObject::get_array(), JsonObject::get_int(), JsonIn::get_object(), JsonObject::get_object(), JsonObject::has_object(), inp_mngr, kill_tracker_ptr, load_map(), mapgen_defer::member, mostseen, mtype_id, OMAPX, OMAPY, input_manager::pump_events(), JsonObject::read(), scent_map::reset(), safe_mode, SAFE_MODE_OFF, SAFE_MODE_ON, savegame_loading_version, scent, SPRING, stats_tracker_ptr, token_provider_ptr, calendar::turn, calendar::turn_zero, u, point::x, tripoint::x, point::y, tripoint::y, and tripoint::z.

Referenced by load().

◆ unserialize_master()

void game::unserialize_master ( std::istream &  fin)

Definition at line 1193 of file savegame.cpp.

1194{
1196 chkversion( fin );
1197 if( savegame_loading_version < 11 ) {
1198 std::unique_ptr<static_popup>popup = std::make_unique<static_popup>();
1199 popup->message(
1200 _( "Cannot find loader for save data in old version %d, attempting to load as current version %d." ),
1204 }
1205 try {
1206 // single-pass parsing example
1207 JsonIn jsin( fin );
1208 jsin.start_object();
1209 while( !jsin.end_object() ) {
1210 std::string name = jsin.get_member_name();
1211 if( name == "next_mission_id" ) {
1212 next_mission_id = jsin.get_int();
1213 } else if( name == "next_npc_id" ) {
1214 next_npc_id.deserialize( jsin );
1215 } else if( name == "active_missions" ) {
1217 } else if( name == "factions" ) {
1218 jsin.read( *faction_manager_ptr );
1219 } else if( name == "seed" ) {
1220 jsin.read( seed );
1221 } else if( name == "weather" ) {
1222 JsonObject w = jsin.get_object();
1223 w.read( "lightning", get_weather().lightning_active );
1224 } else {
1225 // silently ignore anything else
1226 jsin.skip_value();
1227 }
1228 }
1229 } catch( const JsonError &e ) {
1230 debugmsg( "error loading %s: %s", SAVE_MASTER, e.c_str() );
1231 }
1232}
void deserialize(JsonIn &)
static void unserialize_all(JsonIn &jsin)
Definition: savegame.cpp:1183

References _, JsonError::c_str(), chkversion(), debugmsg, character_id::deserialize(), JsonIn::end_object(), faction_manager_ptr, JsonIn::get_int(), JsonIn::get_member_name(), JsonIn::get_object(), get_weather, om_direction::name(), next_mission_id, next_npc_id, popup(), JsonIn::read(), JsonObject::read(), ui_manager::redraw(), refresh_display(), SAVE_MASTER(), savegame_loading_version, savegame_version, seed, JsonIn::skip_value(), JsonIn::start_object(), and mission::unserialize_all().

Referenced by load_master().

◆ update_map() [1/2]

point game::update_map ( int &  x,
int &  y 
)

Definition at line 10608 of file game.cpp.

10609{
10610 point shift;
10611
10612 while( x < HALF_MAPSIZE_X ) {
10613 x += SEEX;
10614 shift.x--;
10615 }
10616 while( x >= HALF_MAPSIZE_X + SEEX ) {
10617 x -= SEEX;
10618 shift.x++;
10619 }
10620 while( y < HALF_MAPSIZE_Y ) {
10621 y += SEEY;
10622 shift.y--;
10623 }
10624 while( y >= HALF_MAPSIZE_Y + SEEY ) {
10625 y -= SEEY;
10626 shift.y++;
10627 }
10628
10629 if( shift == point_zero ) {
10630 // adjust player position
10631 u.setpos( tripoint( x, y, get_levz() ) );
10632 // Update what parts of the world map we can see
10633 // We need this call because even if the map hasn't shifted we may have changed z-level and can now see farther
10634 // TODO: only make this call if we changed z-level
10636 // Not actually shifting the submaps, all the stuff below would do nothing
10637 return point_zero;
10638 }
10639
10640 // this handles loading/unloading submaps that have scrolled on or off the viewport
10641 // NOLINTNEXTLINE(cata-use-named-point-constants)
10642 inclusive_rectangle<point> size_1( point( -1, -1 ), point( 1, 1 ) );
10643 point remaining_shift = shift;
10644 while( remaining_shift != point_zero ) {
10645 point this_shift = clamp( remaining_shift, size_1 );
10646 m.shift( this_shift );
10647 remaining_shift -= this_shift;
10648 }
10649
10650 grid_tracker_ptr->load( m );
10651
10652 // Shift monsters
10653 shift_monsters( tripoint( shift, 0 ) );
10654 const point shift_ms = sm_to_ms_copy( shift );
10655 u.shift_destination( -shift_ms );
10656
10657 // Shift NPCs
10658 for( auto it = active_npc.begin(); it != active_npc.end(); ) {
10659 ( *it )->shift( shift );
10660 if( ( *it )->posx() < 0 - SEEX * 2 || ( *it )->posy() < 0 - SEEX * 2 ||
10661 ( *it )->posx() > SEEX * ( MAPSIZE + 2 ) || ( *it )->posy() > SEEY * ( MAPSIZE + 2 ) ) {
10662 //Remove the npc from the active list. It remains in the overmap list.
10663 ( *it )->on_unload();
10664 it = active_npc.erase( it );
10665 } else {
10666 it++;
10667 }
10668 }
10669
10670 scent.shift( shift_ms );
10671
10672 // Also ensure the player is on current z-level
10673 // get_levz() should later be removed, when there is no longer such a thing
10674 // as "current z-level"
10675 u.setpos( tripoint( x, y, get_levz() ) );
10676
10677 // Only do the loading after all coordinates have been shifted.
10678
10679 // Check for overmap saved npcs that should now come into view.
10680 // Put those in the active list.
10681 load_npcs();
10682
10683 // Make sure map cache is consistent since it may have shifted.
10684 if( m.has_zlevels() ) {
10685 for( int zlev = -OVERMAP_DEPTH; zlev <= OVERMAP_HEIGHT; ++zlev ) {
10686 m.invalidate_map_cache( zlev );
10687 }
10688 } else {
10690 }
10692
10693 // Spawn monsters if appropriate
10694 // This call will generate new monsters in addition to loading, so it's placed after NPC loading
10695 m.spawn_monsters( false ); // Static monsters
10696
10697 // Update what parts of the world map we can see
10699
10700 return shift;
10701}
void shift_destination(const point &shift)
void shift_monsters(const tripoint &shift)
Shift all active monsters, the shift vector is the number of shifted submaps.
Definition: game.cpp:10977
void shift(const point &s)
Shift the map along the vector s.
Definition: map.cpp:6781
void shift(const point &sm_shift)
Definition: scent_map.cpp:82
point sm_to_ms_copy(const point &p)
static constexpr int HALF_MAPSIZE_Y
static constexpr int HALF_MAPSIZE_X

References active_npc, map::build_map_cache(), clamp(), get_levz(), grid_tracker_ptr, HALF_MAPSIZE_X, HALF_MAPSIZE_Y, map::has_zlevels(), map::invalidate_map_cache(), load_npcs(), m, MAPSIZE, OVERMAP_DEPTH, OVERMAP_HEIGHT, point_zero, scent, SEEX, SEEY, Character::setpos(), map::shift(), scent_map::shift(), Character::shift_destination(), shift_monsters(), sm_to_ms_copy(), map::spawn_monsters(), u, update_overmap_seen(), point::x, and point::y.

◆ update_map() [2/2]

point game::update_map ( player p)

Definition at line 10602 of file game.cpp.

10603{
10604 point p2( p.posx(), p.posy() );
10605 return update_map( p2.x, p2.y );
10606}

References Character::posx(), Character::posy(), update_map(), point::x, and point::y.

Referenced by fling_creature(), load(), place_player(), start_game(), update_map(), and vertical_move().

◆ update_overmap_seen()

void game::update_overmap_seen ( )

Definition at line 10703 of file game.cpp.

10704{
10705 const tripoint_abs_omt ompos = u.global_omt_location();
10706 const int dist = u.overmap_sight_range( light_level( u.posz() ) );
10707 const int dist_squared = dist * dist;
10708 // We can always see where we're standing
10709 overmap_buffer.set_seen( ompos, true );
10710 for( const tripoint_abs_omt &p : points_in_radius( ompos, dist ) ) {
10711 const point_rel_omt delta = p.xy() - ompos.xy();
10712 const int h_squared = delta.x() * delta.x() + delta.y() * delta.y();
10713 if( trigdist && h_squared > dist_squared ) {
10714 continue;
10715 }
10716 if( delta == point_rel_omt() ) {
10717 // 1. This case is already handled outside of the loop
10718 // 2. Calculating multiplier would cause division by zero
10719 continue;
10720 }
10721 // If circular distances are enabled, scale overmap distances by the diagonality of the sight line.
10722 point abs_delta = delta.raw().abs();
10723 int max_delta = std::max( abs_delta.x, abs_delta.y );
10724 const float multiplier = trigdist ? std::sqrt( h_squared ) / max_delta : 1;
10725 const std::vector<tripoint_abs_omt> line = line_to( ompos, p );
10726 float sight_points = dist;
10727 for( auto it = line.begin();
10728 it != line.end() && sight_points >= 0; ++it ) {
10729 const oter_id &ter = overmap_buffer.ter( *it );
10730 sight_points -= static_cast<int>( ter->get_see_cost() ) * multiplier;
10731 }
10732 if( sight_points >= 0 ) {
10733 tripoint_abs_omt seen( p );
10734 do {
10735 overmap_buffer.set_seen( seen, true );
10736 --seen.z();
10737 } while( seen.z() >= 0 );
10738 }
10739 }
10740}
bool trigdist
Circular distances.
int overmap_sight_range(int light_level) const
Returns the distance the player can see on the overmap.
Definition: character.cpp:778
constexpr Point & raw()
Definition: coordinates.h:111
void set_seen(const tripoint_abs_omt &p, bool seen=true)
coords::coord_point< point, coords::origin::relative, coords::omt > point_rel_omt
Definition: coordinates.h:478
tripoint_range< Tripoint > points_in_radius(const Tripoint &center, const int radius, const int radiusz=0)
Definition: map_iterator.h:125
unsigned char get_see_cost() const
Definition: omdata.h:230

References oter_t::get_see_cost(), Character::global_omt_location(), light_level(), line(), line_to(), overmap_buffer, Character::overmap_sight_range(), points_in_radius(), Character::posz(), coords::coord_point< Point, Origin, Scale >::raw(), overmapbuffer::set_seen(), overmapbuffer::ter(), trigdist, u, coords::coord_point< Point, Origin, Scale >::x(), point::x, coords::coord_point< Point, Origin, Scale >::xy(), coords::coord_point< Point, Origin, Scale >::y(), point::y, and coords::coord_point< Point, Origin, Scale >::z().

Referenced by place_player_overmap(), and update_map().

◆ update_stair_monsters()

void game::update_stair_monsters ( )
private
Dodge reduces chance of being downed when pushed off the stairs

Definition at line 10755 of file game.cpp.

10756{
10757 // Search for the stairs closest to the player.
10758 std::vector<int> stairx;
10759 std::vector<int> stairy;
10760 std::vector<int> stairdist;
10761
10762 const bool from_below = monstairz < get_levz();
10763
10764 if( coming_to_stairs.empty() ) {
10765 return;
10766 }
10767
10768 if( m.has_zlevels() ) {
10769 debugmsg( "%d monsters coming to stairs on a map with z-levels",
10770 coming_to_stairs.size() );
10771 coming_to_stairs.clear();
10772 }
10773
10774 for( const tripoint &dest : m.points_on_zlevel( u.posz() ) ) {
10775 if( ( from_below && m.has_flag( "GOES_DOWN", dest ) ) ||
10776 ( !from_below && m.has_flag( "GOES_UP", dest ) ) ) {
10777 stairx.push_back( dest.x );
10778 stairy.push_back( dest.y );
10779 stairdist.push_back( rl_dist( dest, u.pos() ) );
10780 }
10781 }
10782 if( stairdist.empty() ) {
10783 return; // Found no stairs?
10784 }
10785
10786 // Find closest stairs.
10787 size_t si = 0;
10788 for( size_t i = 0; i < stairdist.size(); i++ ) {
10789 if( stairdist[i] < stairdist[si] ) {
10790 si = i;
10791 }
10792 }
10793
10794 // Find up to 4 stairs for distance stairdist[si] +1
10795 std::vector<int> nearest;
10796 nearest.push_back( si );
10797 for( size_t i = 0; i < stairdist.size() && nearest.size() < 4; i++ ) {
10798 if( ( i != si ) && ( stairdist[i] <= stairdist[si] + 1 ) ) {
10799 nearest.push_back( i );
10800 }
10801 }
10802 // Randomize the stair choice
10803 si = random_entry_ref( nearest );
10804
10805 // Attempt to spawn zombies.
10806 for( size_t i = 0; i < coming_to_stairs.size(); i++ ) {
10807 point mpos( stairx[si], stairy[si] );
10808 monster &critter = coming_to_stairs[i];
10809 const tripoint dest {
10810 mpos, g->get_levz()
10811 };
10812
10813 // We might be not be visible.
10814 if( ( critter.posx() < 0 - ( MAPSIZE_X ) / 6 ||
10815 critter.posy() < 0 - ( MAPSIZE_Y ) / 6 ||
10816 critter.posx() > ( MAPSIZE_X * 7 ) / 6 ||
10817 critter.posy() > ( MAPSIZE_Y * 7 ) / 6 ) ) {
10818 continue;
10819 }
10820
10821 critter.staircount -= 4;
10822 // Let the player know zombies are trying to come.
10823 if( u.sees( dest ) ) {
10824 std::string dump;
10825 if( critter.staircount > 4 ) {
10826 dump += string_format( _( "You see a %s on the stairs" ), critter.name() );
10827 } else {
10828 if( critter.staircount > 0 ) {
10829 dump += ( from_below ?
10830 //~ The <monster> is almost at the <bottom/top> of the <terrain type>!
10831 string_format( _( "The %1$s is almost at the top of the %2$s!" ),
10832 critter.name(),
10833 m.tername( dest ) ) :
10834 string_format( _( "The %1$s is almost at the bottom of the %2$s!" ),
10835 critter.name(),
10836 m.tername( dest ) ) );
10837 }
10838 }
10839
10840 add_msg( m_warning, dump );
10841 } else {
10843 _( "a sound nearby from the stairs!" ), true, "misc", "stairs_movement" );
10844 }
10845
10846 if( critter.staircount > 0 ) {
10847 continue;
10848 }
10849
10850 if( is_empty( dest ) ) {
10851 critter.spawn( dest );
10852 critter.staircount = 0;
10853 place_critter_at( make_shared_fast<monster>( critter ), dest );
10854 if( u.sees( dest ) ) {
10855 if( !from_below ) {
10856 add_msg( m_warning, _( "The %1$s comes down the %2$s!" ),
10857 critter.name(),
10858 m.tername( dest ) );
10859 } else {
10860 add_msg( m_warning, _( "The %1$s comes up the %2$s!" ),
10861 critter.name(),
10862 m.tername( dest ) );
10863 }
10864 }
10865 coming_to_stairs.erase( coming_to_stairs.begin() + i );
10866 continue;
10867 } else if( u.pos() == dest ) {
10868 // Monster attempts to push player of stairs
10870 int tries = 0;
10871
10872 // the critter is now right on top of you and will attack unless
10873 // it can find a square to push you into with one of his tries.
10874 const int creature_push_attempts = 9;
10875 const int player_throw_resist_chance = 3;
10876
10877 critter.spawn( dest );
10878 while( tries < creature_push_attempts ) {
10879 tries++;
10880 push.x = rng( -1, 1 );
10881 push.y = rng( -1, 1 );
10882 point ipos( mpos + push );
10883 tripoint pos( ipos, get_levz() );
10884 if( ( push.x != 0 || push.y != 0 ) && !critter_at( pos ) &&
10885 critter.can_move_to( pos ) ) {
10886 bool resiststhrow = ( u.is_throw_immune() ) ||
10888 if( resiststhrow && one_in( player_throw_resist_chance ) ) {
10889 u.moves -= 25; // small charge for avoiding the push altogether
10890 add_msg( _( "The %s fails to push you back!" ),
10891 critter.name() );
10892 return; //judo or leg brace prevent you from getting pushed at all
10893 }
10894 // Not accounting for tentacles latching on, so..
10895 // Something is about to happen, lets charge half a move
10896 u.moves -= 50;
10897 if( resiststhrow && ( u.is_throw_immune() ) ) {
10898 //we have a judoka who isn't getting pushed but counterattacking now.
10899 mattack::thrown_by_judo( &critter );
10900 return;
10901 }
10902 std::string msg;
10903 ///\EFFECT_DODGE reduces chance of being downed when pushed off the stairs
10904 if( !( resiststhrow ) && ( u.get_dodge() + rng( 0, 3 ) < 12 ) ) {
10905 // dodge 12 - never get downed
10906 // 11.. avoid 75%; 10.. avoid 50%; 9.. avoid 25%
10907 u.add_effect( effect_downed, 2_turns );
10908 msg = _( "The %s pushed you back hard!" );
10909 } else {
10910 msg = _( "The %s pushed you back!" );
10911 }
10912 add_msg( m_warning, msg.c_str(), critter.name() );
10913 u.setx( u.posx() + push.x );
10914 u.sety( u.posy() + push.y );
10915 return;
10916 }
10917 }
10919 _( "The %s tried to push you back but failed! It attacks you!" ),
10920 critter.name() );
10921 critter.melee_attack( u );
10922 u.moves -= 50;
10923 return;
10924 } else if( monster *const mon_ptr = critter_at<monster>( dest ) ) {
10925 // Monster attempts to displace a monster from the stairs
10926 monster &other = *mon_ptr;
10927 critter.spawn( dest );
10928
10929 // the critter is now right on top of another and will push it
10930 // if it can find a square to push it into inside of his tries.
10931 const int creature_push_attempts = 9;
10932 const int creature_throw_resist = 4;
10933
10934 int tries = 0;
10935 point push2;
10936 while( tries < creature_push_attempts ) {
10937 tries++;
10938 push2.x = rng( -1, 1 );
10939 push2.y = rng( -1, 1 );
10940 point ipos2( mpos + push2 );
10941 tripoint pos( ipos2, get_levz() );
10942 if( ( push2.x == 0 && push2.y == 0 ) || ( ( ipos2.x == u.posx() ) && ( ipos2.y == u.posy() ) ) ) {
10943 continue;
10944 }
10945 if( !critter_at( pos ) && other.can_move_to( pos ) ) {
10946 other.setpos( tripoint( ipos2, get_levz() ) );
10947 other.moves -= 50;
10948 std::string msg;
10949 if( one_in( creature_throw_resist ) ) {
10950 other.add_effect( effect_downed, 2_turns );
10951 msg = _( "The %1$s pushed the %2$s hard." );
10952 } else {
10953 msg = _( "The %1$s pushed the %2$s." );
10954 }
10955 add_msg( m_neutral, msg, critter.name(), other.name() );
10956 return;
10957 }
10958 }
10959 return;
10960 }
10961 }
10962}
void setx(int x)
Definition: character.h:822
void sety(int y)
Definition: character.h:825
bool is_throw_immune() const
Returns true if the player is immune to throws.
float get_dodge() const override
Definition: melee.cpp:806
int monstairz
Definition: game.h:984
tripoint_range< tripoint > points_on_zlevel() const
Yields a range of all points that are contained in the map and have the z-level of this map (abs_sub)...
Definition: map.cpp:8640
bool can_move_to(const tripoint &p) const
Checks whether we can move to/through p.
Definition: monmove.cpp:258
int posy() const override
Definition: monster.h:500
void melee_attack(Creature &target)
Definition: monster.cpp:1389
int staircount
Definition: monster.h:511
void spawn(const tripoint &p)
Definition: monster.cpp:482
int posx() const override
Definition: monster.h:497
bool thrown_by_judo(monster *z)
Definition: monattack.cpp:4672
std::enable_if<!is_std_array< C >::value, constV & >::type random_entry_ref(const C &container)
Same as above, but with a statically allocated default value (using the default constructor).
Definition: rng.h:149

References _, Creature::add_effect(), add_msg(), monster::can_move_to(), coming_to_stairs, critter_at(), debugmsg, effect_downed, g, Character::get_dodge(), get_levz(), map::has_flag(), Character::has_trait(), map::has_zlevels(), is_empty(), Character::is_throw_immune(), m, m_neutral, m_warning, MAPSIZE_X, MAPSIZE_Y, monster::melee_attack(), monstairz, sounds::movement, Creature::moves, monster::name(), one_in(), other, place_critter_at(), point_north_west, map::points_on_zlevel(), Character::pos(), Character::posx(), monster::posx(), Character::posy(), monster::posy(), Character::posz(), monexamine::push(), random_entry_ref(), rl_dist(), rng(), Character::sees(), Character::setx(), Character::sety(), sounds::sound(), monster::spawn(), monster::staircount, string_format(), map::tername(), mattack::thrown_by_judo(), trait_LEG_TENT_BRACE, u, point::x, and point::y.

Referenced by do_turn(), and vertical_move().

◆ update_zombie_pos()

bool game::update_zombie_pos ( const monster critter,
const tripoint pos 
)

Redirects to the creature_tracker update_pos() function.

Definition at line 4679 of file game.cpp.

4680{
4681 return critter_tracker->update_pos( critter, pos );
4682}

References critter_tracker.

◆ use_computer()

void game::use_computer ( const tripoint p)

Checks to see if a player can use a computer (not illiterate, etc.) and uses if able.

Definition at line 4462 of file game.cpp.

4463{
4464 if( u.has_trait( trait_id( "ILLITERATE" ) ) ) {
4465 add_msg( m_info, _( "You can not read a computer screen!" ) );
4466 return;
4467 }
4468 if( u.is_blind() ) {
4469 // we don't have screen readers in game
4470 add_msg( m_info, _( "You can not see a computer screen!" ) );
4471 return;
4472 }
4473 if( u.has_trait( trait_id( "HYPEROPIC" ) ) && !u.worn_with_flag( "FIX_FARSIGHT" ) &&
4474 !u.has_effect( effect_contacts ) && !u.has_bionic( bionic_id( "bio_eye_optic" ) ) ) {
4475 add_msg( m_info, _( "You'll need to put on reading glasses before you can see the screen." ) );
4476 return;
4477 }
4478
4479 computer *used = m.computer_at( p );
4480
4481 if( used == nullptr ) {
4482 if( m.has_flag( "CONSOLE", p ) ) { //Console without map data
4483 add_msg( m_bad, _( "The console doesn't display anything coherent." ) );
4484 } else {
4485 debugmsg( "Tried to use computer at %s - none there", p.to_string() );
4486 }
4487 return;
4488 }
4489
4490 computer_session( *used ).use();
4491}
void use()
Handles player use of a computer.
computer * computer_at(const tripoint &p)
Definition: map.cpp:5556
static const efftype_id effect_contacts("contacts")

References _, add_msg(), map::computer_at(), debugmsg, effect_contacts, Character::has_bionic(), Creature::has_effect(), map::has_flag(), Character::has_trait(), Character::is_blind(), m, m_bad, m_info, tripoint::to_string(), u, computer_session::use(), and Character::worn_with_flag().

Referenced by examine().

◆ validate_camps()

void game::validate_camps ( )

validate camps to ensure they are on the overmap list

Definition at line 1949 of file game.cpp.

1950{
1951 basecamp camp = m.hoist_submap_camp( u.pos() );
1952 if( camp.is_valid() ) {
1953 overmap_buffer.add_camp( camp );
1955 } else if( camp.camp_omt_pos() != tripoint_abs_omt() ) {
1956 std::string camp_name = _( "Faction Camp" );
1957 camp.set_name( camp_name );
1958 overmap_buffer.add_camp( camp );
1960 }
1961}
bool is_valid() const
Definition: basecamp.h:125
void set_name(const std::string &new_name)
Definition: basecamp.cpp:575
tripoint_abs_omt camp_omt_pos() const
Definition: basecamp.h:134
basecamp hoist_submap_camp(const tripoint &p)
Definition: map.cpp:5587
void remove_submap_camp(const tripoint &)
Definition: map.cpp:5582
void add_camp(const basecamp &camp)
Add Basecamp to overmapbuffer.

References _, overmapbuffer::add_camp(), basecamp::camp_omt_pos(), map::hoist_submap_camp(), basecamp::is_valid(), m, overmap_buffer, Character::pos(), map::remove_submap_camp(), basecamp::set_name(), and u.

Referenced by load().

◆ validate_linked_vehicles()

void game::validate_linked_vehicles ( )

validate towed vehicles so they get linked up again after a load

Definition at line 1891 of file game.cpp.

1892{
1893 for( auto &veh : m.get_vehicles() ) {
1894 vehicle *v = veh.v;
1897 if( other_v ) {
1898 // the other vehicle is towing us.
1899 v->tow_data.set_towing( other_v, v );
1901 }
1902 }
1903 }
1904}
tripoint other_towing_point
Definition: vehicle.h:167
bool set_towing(vehicle *tower_veh, vehicle *towed_veh)
Definition: vehicle.cpp:6117
towing_data tow_data
Definition: vehicle.h:1944

References map::get_vehicles(), m, towing_data::other_towing_point, towing_data::set_towing(), vehicle::tow_data, tripoint_zero, map::veh_at(), and veh_pointer_or_null().

Referenced by load().

◆ validate_mounted_npcs()

void game::validate_mounted_npcs ( )

Definition at line 1906 of file game.cpp.

1907{
1908 for( monster &m : all_monsters() ) {
1909 if( m.has_effect( effect_ridden ) && m.mounted_player_id.is_valid() ) {
1910 player *mounted_pl = g->critter_by_id<player>( m.mounted_player_id );
1911 if( !mounted_pl ) {
1912 // Target no longer valid.
1913 m.mounted_player_id = character_id();
1914 m.remove_effect( effect_ridden );
1915 continue;
1916 }
1917 mounted_pl->mounted_creature = shared_from( m );
1918 mounted_pl->setpos( m.pos() );
1919 mounted_pl->add_effect( effect_riding, 1_turns, num_bp );
1920 m.mounted_player = mounted_pl;
1921 }
1922 }
1923}

References Creature::add_effect(), all_monsters(), character_id, effect_ridden, effect_riding, g, m, Character::mounted_creature, num_bp, Character::setpos(), and shared_from().

Referenced by load(), and vertical_shift().

◆ validate_npc_followers()

void game::validate_npc_followers ( )

validate list of followers to account for overmap buffers

Definition at line 1925 of file game.cpp.

1926{
1927 // Make sure visible followers are in the list.
1928 const std::vector<npc *> visible_followers = get_npcs_if( [&]( const npc & guy ) {
1929 return guy.is_player_ally();
1930 } );
1931 for( npc *guy : visible_followers ) {
1932 update_faction_api( guy );
1933 add_npc_follower( guy->getID() );
1934 }
1935 // Make sure overmapbuffered NPC followers are in the list.
1936 for( const auto &temp_guy : overmap_buffer.get_npcs_near_player( 300 ) ) {
1937 npc *guy = temp_guy.get();
1938 if( guy->is_player_ally() ) {
1939 update_faction_api( guy );
1940 add_npc_follower( guy->getID() );
1941 }
1942 }
1943 // Make sure that serialized player followers sync up with game list
1944 for( const auto &temp_id : u.follower_ids ) {
1945 add_npc_follower( temp_id );
1946 }
1947}
void add_npc_follower(const character_id &id)
Add follower id to set of followers.
Definition: game.cpp:1871
static void update_faction_api(npc *guy)
Definition: game.cpp:1883

References add_npc_follower(), player::follower_ids, get_npcs_if(), overmapbuffer::get_npcs_near_player(), Character::getID(), npc::is_player_ally(), overmap_buffer, u, and update_faction_api().

Referenced by load().

◆ vertical_move()

void game::vertical_move ( int  z,
bool  force,
bool  peeking = false 
)

Moves the player vertically.

If force == true then they are falling. If peeking == true, forbids some exotic movement options

Strength increases breath-holding capacity while diving Dexterity increases chance of moving past monsters on stairs Dodge increases chance of moving past monsters on stairs Strength increases chance of moving past monsters on stairs Melee increases chance of moving past monsters on stairs

Definition at line 9929 of file game.cpp.

9930{
9931 if( u.is_mounted() ) {
9932 auto mons = u.mounted_creature.get();
9933 if( mons->has_flag( MF_RIDEABLE_MECH ) ) {
9934 if( !mons->check_mech_powered() ) {
9935 add_msg( m_bad, _( "Your %s refuses to move as its batteries have been drained." ),
9936 mons->get_name() );
9937 return;
9938 }
9939 }
9940 }
9941
9942 // > and < are used for diving underwater.
9943 if( m.has_flag( "SWIMMABLE", u.pos() ) && m.has_flag( TFLAG_DEEP_WATER, u.pos() ) ) {
9944 if( movez == -1 ) {
9945 if( u.is_underwater() ) {
9946 add_msg( m_info, _( "You are already underwater!" ) );
9947 return;
9948 }
9949 if( u.worn_with_flag( "FLOTATION" ) ) {
9950 add_msg( m_info, _( "You can't dive while wearing a flotation device." ) );
9951 return;
9952 }
9953 u.set_underwater( true );
9954 ///\EFFECT_STR increases breath-holding capacity while diving
9955 u.oxygen = 30 + 2 * u.str_cur;
9956 add_msg( _( "You dive underwater!" ) );
9957 } else {
9958 if( u.swim_speed() < 500 || u.shoe_type_count( itype_swim_fins ) ) {
9959 u.set_underwater( false );
9960 add_msg( _( "You surface." ) );
9961 } else {
9962 add_msg( m_info, _( "You try to surface but can't!" ) );
9963 }
9964 }
9965 u.moves -= 100;
9966 return;
9967 }
9968
9969 // Force means we're going down, even if there's no staircase, etc.
9970 bool climbing = false;
9971 int move_cost = 100;
9972 tripoint stairs( u.posx(), u.posy(), u.posz() + movez );
9973 if( m.has_zlevels() && !force && movez == 1 && !m.has_flag( "GOES_UP", u.pos() ) ) {
9974 // Climbing
9975 if( m.has_floor_or_support( stairs ) ) {
9976 add_msg( m_info, _( "You can't climb here - there's a ceiling above your head." ) );
9977 return;
9978 }
9979
9980 std::vector<tripoint> pts;
9981 for( const auto &pt : m.points_in_radius( stairs, 1 ) ) {
9982 if( m.passable( pt ) &&
9983 m.has_floor_or_support( pt ) ) {
9984 pts.push_back( pt );
9985 }
9986 }
9987
9988 const int cost = map_funcs::climbing_cost( m, u.pos(), stairs );
9989
9990 if( cost == 0 ) {
9991 if( u.has_trait( trait_WEB_ROPE ) ) {
9992 if( pts.empty() ) {
9993 add_msg( m_info, _( "There is nothing above you that you can attach a web to." ) );
9994 } else if( can_use_mutation_warn( trait_WEB_ROPE, u ) ) {
9995 if( m.move_cost( u.pos() ) != 2 && m.move_cost( u.pos() ) != 3 ) {
9996 add_msg( m_info, _( "You can't spin a web rope there." ) );
9997 } else if( m.has_furn( u.pos() ) ) {
9998 add_msg( m_info, _( "There is already furniture at that location." ) );
9999 } else {
10000 if( query_yn( "Spin a rope and climb?" ) ) {
10001 add_msg( m_good, _( "You spin a rope of web." ) );
10002 m.furn_set( u.pos(), furn_str_id( "f_rope_up_web" ) );
10003 u.mod_moves( to_turns<int>( 2_seconds ) );
10005 vertical_move( movez, force, peeking );
10006 }
10007 }
10008 }
10009
10010 } else {
10011 add_msg( m_info, _( "You can't climb here - you need walls and/or furniture to brace against." ) );
10012
10013 }
10014 return;
10015
10016 }
10017
10018 if( cost <= 0 || pts.empty() ) {
10019 add_msg( m_info,
10020 _( "You can't climb here - there is no terrain above you that would support your weight." ) );
10021 return;
10022 } else {
10023 // TODO: Make it an extended action
10024 climbing = true;
10025 move_cost = cost;
10026
10028 if( !pnt ) {
10029 return;
10030 }
10031 stairs = *pnt;
10032 }
10033 }
10034
10035 if( !force && movez == -1 && !m.has_flag( "GOES_DOWN", u.pos() ) ) {
10036 add_msg( m_info, _( "You can't go down here!" ) );
10037 return;
10038 } else if( !climbing && !force && movez == 1 && !m.has_flag( "GOES_UP", u.pos() ) ) {
10039 add_msg( m_info, _( "You can't go up here!" ) );
10040 return;
10041 }
10042
10043 if( force ) {
10044 // Let go of a grabbed cart.
10045 u.grab( OBJECT_NONE );
10046 } else if( u.grab_point != tripoint_zero ) {
10047 add_msg( m_info, _( "You can't drag things up and down stairs." ) );
10048 return;
10049 }
10050
10051 // Because get_levz takes z-value from the map, it will change when vertical_shift (m.has_zlevels() == true)
10052 // is called or when the map is loaded on new z-level (== false).
10053 // This caches the z-level we start the movement on (current) and the level we're want to end.
10054 const int z_before = get_levz();
10055 const int z_after = get_levz() + movez;
10056 if( z_after < -OVERMAP_DEPTH || z_after > OVERMAP_HEIGHT ) {
10057 debugmsg( "Tried to move outside allowed range of z-levels" );
10058 return;
10059 }
10060
10061 if( !u.move_effects( false ) ) {
10062 return;
10063 }
10064
10065 // Check if there are monsters are using the stairs.
10066 bool slippedpast = false;
10067 if( !m.has_zlevels() && !coming_to_stairs.empty() && !force ) {
10068 // TODO: Allow travel if zombie couldn't reach stairs, but spawn him when we go up.
10069 add_msg( m_warning, _( "You try to use the stairs. Suddenly you are blocked by a %s!" ),
10070 coming_to_stairs[0].name() );
10071 // Roll.
10072 ///\EFFECT_DEX increases chance of moving past monsters on stairs
10073
10074 ///\EFFECT_DODGE increases chance of moving past monsters on stairs
10075 int dexroll = dice( 6, u.dex_cur + u.get_skill_level( skill_dodge ) * 2 );
10076 ///\EFFECT_STR increases chance of moving past monsters on stairs
10077
10078 ///\EFFECT_MELEE increases chance of moving past monsters on stairs
10079 int strroll = dice( 3, u.str_cur + u.get_skill_level( skill_melee ) * 1.5 );
10080 if( coming_to_stairs.size() > 4 ) {
10081 add_msg( _( "The are a lot of them on the %s!" ), m.tername( u.pos() ) );
10082 dexroll /= 4;
10083 strroll /= 2;
10084 } else if( coming_to_stairs.size() > 1 ) {
10085 add_msg( m_warning, _( "There's something else behind it!" ) );
10086 dexroll /= 2;
10087 }
10088
10089 if( dexroll < 14 || strroll < 12 ) {
10091 u.moves -= 100;
10092 return;
10093 }
10094
10095 add_msg( _( "You manage to slip past!" ) );
10096 slippedpast = true;
10097 u.moves -= 100;
10098 }
10099
10100 // Shift the map up or down
10101
10102 std::unique_ptr<map> tmp_map_ptr;
10103 if( !m.has_zlevels() ) {
10104 tmp_map_ptr = std::make_unique<map>();
10105 }
10106
10107 map &maybetmp = m.has_zlevels() ? m : *( tmp_map_ptr.get() );
10108 if( m.has_zlevels() ) {
10109 // We no longer need to shift the map here! What joy
10110 } else {
10111 maybetmp.load( tripoint( get_levx(), get_levy(), z_after ), false );
10112 }
10113
10114 // Find the corresponding staircase
10115 bool rope_ladder = false;
10116 // TODO: Remove the stairfinding, make the mapgen gen aligned maps
10117 if( !force && !climbing ) {
10118 const cata::optional<tripoint> pnt = find_or_make_stairs( maybetmp, z_after, rope_ladder, peeking );
10119 if( !pnt ) {
10120 return;
10121 }
10122 stairs = *pnt;
10123 }
10124
10125 if( !force ) {
10126 monstairz = z_before;
10127 }
10128 // Save all monsters that can reach the stairs, remove them from the tracker,
10129 // then despawn the remaining monsters. Because it's a vertical shift, all
10130 // monsters are out of the bounds of the map and will despawn.
10131 shared_ptr_fast<monster> stored_mount;
10132 if( u.is_mounted() && !m.has_zlevels() ) {
10133 // Store a *copy* of the mount, so we can remove the original monster instance
10134 // from the tracker before the map shifts.
10135 // Map shifting would otherwise just despawn the mount and would later respawn it.
10136 stored_mount = make_shared_fast<monster>( *u.mounted_creature );
10138 }
10139 if( !m.has_zlevels() ) {
10140 const tripoint to = u.pos();
10141 for( monster &critter : all_monsters() ) {
10142 // if its a ladder instead of stairs - most zombies can't climb that.
10143 // unless that have a special flag to allow them to do so.
10144 if( ( m.has_flag( "DIFFICULT_Z", u.pos() ) && !critter.climbs() ) ||
10145 critter.has_effect( effect_ridden ) ||
10146 critter.has_effect( effect_tied ) ) {
10147 continue;
10148 }
10149 int turns = critter.turns_to_reach( to.xy() );
10150 if( turns < 10 && coming_to_stairs.size() < 8 && critter.will_reach( to.xy() )
10151 && !slippedpast ) {
10152 critter.staircount = 10 + turns;
10153 critter.on_unload();
10154 coming_to_stairs.push_back( critter );
10155 remove_zombie( critter );
10156 }
10157 }
10158 auto mons = critter_tracker->find( g->u.pos() );
10159 if( mons != nullptr ) {
10160 critter_tracker->remove( *mons );
10161 }
10162 shift_monsters( tripoint( 0, 0, movez ) );
10163 }
10164
10165 std::vector<shared_ptr_fast<npc>> npcs_to_bring;
10166 std::vector<monster *> monsters_following;
10167 if( !m.has_zlevels() && std::abs( movez ) == 1 ) {
10168 std::copy_if( active_npc.begin(), active_npc.end(), back_inserter( npcs_to_bring ),
10169 [this]( const shared_ptr_fast<npc> &np ) {
10170 return np->is_walking_with() && !np->is_mounted() && !np->in_sleep_state() &&
10171 rl_dist( np->pos(), u.pos() ) < 2;
10172 } );
10173 }
10174
10175 if( m.has_zlevels() && std::abs( movez ) == 1 ) {
10176 bool ladder = m.has_flag( "DIFFICULT_Z", u.pos() );
10177 for( monster &critter : all_monsters() ) {
10178 if( ladder && !critter.climbs() ) {
10179 continue;
10180 }
10181 if( critter.attack_target() == &g->u || ( !critter.has_effect( effect_ridden ) &&
10182 critter.has_effect( effect_pet ) && critter.friendly == -1 &&
10183 !critter.has_effect( effect_tied ) ) ) {
10184 monsters_following.push_back( &critter );
10185 }
10186 }
10187 }
10188
10189 if( u.is_mounted() ) {
10190 monster *crit = u.mounted_creature.get();
10191 if( crit->has_flag( MF_RIDEABLE_MECH ) ) {
10192 crit->use_mech_power( -1 );
10193 if( u.movement_mode_is( CMM_WALK ) ) {
10194 crit->use_mech_power( -2 );
10195 } else if( u.movement_mode_is( CMM_CROUCH ) ) {
10196 crit->use_mech_power( -1 );
10197 } else if( u.movement_mode_is( CMM_RUN ) ) {
10198 crit->use_mech_power( -3 );
10199 }
10200 }
10201 } else {
10202 u.moves -= move_cost;
10203 }
10204 for( const auto &np : npcs_to_bring ) {
10205 if( np->in_vehicle ) {
10206 m.unboard_vehicle( np->pos() );
10207 }
10208 }
10209 const tripoint old_pos = g->u.pos();
10210 point submap_shift;
10211 vertical_shift( z_after );
10212 if( !force ) {
10213 submap_shift = update_map( stairs.x, stairs.y );
10214 }
10215
10216 // if an NPC or monster is on the stiars when player ascends/descends
10217 // they may end up merged on th esame tile, do some displacement to resolve that.
10218 // if, in the weird case of it not being possible to displace;
10219 // ( how did the player even manage to approach the stairs, if so? )
10220 // then nothing terrible happens, its just weird.
10221 if( critter_at<npc>( u.pos(), true ) || critter_at<monster>( u.pos(), true ) ) {
10222 std::string crit_name;
10223 bool player_displace = false;
10225 if( displace.has_value() ) {
10226 npc *guy = g->critter_at<npc>( u.pos(), true );
10227 if( guy ) {
10228 crit_name = guy->get_name();
10229 tripoint old_pos = guy->pos();
10230 if( !guy->is_enemy() ) {
10231 guy->move_away_from( u.pos(), true );
10232 if( old_pos != guy->pos() ) {
10233 add_msg( _( "%s moves out of the way for you." ), guy->get_name() );
10234 }
10235 } else {
10236 player_displace = true;
10237 }
10238 }
10239 monster *mon = g->critter_at<monster>( u.pos(), true );
10240 // if the monster is ridden by the player or an NPC:
10241 // Dont displace them. If they are mounted by a friendly NPC,
10242 // then the NPC will already have been displaced just above.
10243 // if they are ridden by the player, we want them to coexist on same tile
10244 if( mon && !mon->mounted_player ) {
10245 crit_name = mon->get_name();
10246 if( mon->friendly == -1 ) {
10247 mon->setpos( *displace );
10248 add_msg( _( "Your %s moves out of the way for you." ), mon->get_name() );
10249 } else {
10250 player_displace = true;
10251 }
10252 }
10253 if( player_displace ) {
10254 u.setpos( *displace );
10255 u.moves -= 20;
10256 add_msg( _( "You push past %s blocking the way." ), crit_name );
10257 }
10258 } else {
10259 debugmsg( "Failed to find a spot to displace into." );
10260 }
10261 }
10262
10263 // Now that we know the player's destination position, we can move their mount as well
10264 if( u.is_mounted() ) {
10265 if( stored_mount ) {
10266 assert( !m.has_zlevels() );
10267 stored_mount->spawn( g->u.pos() );
10268 if( critter_tracker->add( stored_mount ) ) {
10269 u.mounted_creature = stored_mount;
10270 }
10271 } else {
10272 u.mounted_creature->setpos( g->u.pos() );
10273 }
10274 }
10275
10276 if( !npcs_to_bring.empty() ) {
10277 // Would look nicer randomly scrambled
10278 std::vector<tripoint> candidates = closest_points_first( u.pos(), 1 );
10279 candidates.erase( std::remove_if( candidates.begin(), candidates.end(),
10280 [this]( const tripoint & c ) {
10281 return !is_empty( c );
10282 } ), candidates.end() );
10283
10284 for( const auto &np : npcs_to_bring ) {
10285 const auto found = std::find_if( candidates.begin(), candidates.end(),
10286 [this, np]( const tripoint & c ) {
10287 return !np->is_dangerous_fields( m.field_at( c ) ) && m.tr_at( c ).is_benign();
10288 } );
10289 if( found != candidates.end() ) {
10290 // TODO: De-uglify
10291 np->setpos( *found );
10292 np->place_on_map();
10293 np->setpos( *found );
10294 candidates.erase( found );
10295 }
10296
10297 if( candidates.empty() ) {
10298 break;
10299 }
10300 }
10301
10302 reload_npcs();
10303 }
10304
10305 // This ugly check is here because of stair teleport bullshit
10306 // TODO: Remove stair teleport bullshit
10307 if( rl_dist( g->u.pos(), old_pos ) <= 1 ) {
10308 for( monster *m : monsters_following ) {
10309 m->set_dest( g->u.pos() );
10310 }
10311 }
10312
10313 if( rope_ladder ) {
10314 m.ter_set( u.pos(), t_rope_up );
10315 }
10316
10317 if( m.ter( stairs ) == t_manhole_cover ) {
10318 m.spawn_item( stairs + point( rng( -1, 1 ), rng( -1, 1 ) ), itype_manhole_cover );
10319 m.ter_set( stairs, t_manhole );
10320 }
10321
10322 // Wouldn't work and may do strange things
10323 if( u.is_hauling() && !m.has_zlevels() ) {
10324 add_msg( _( "You cannot haul items here." ) );
10325 u.stop_hauling();
10326 }
10327
10328 if( u.is_hauling() ) {
10329 const tripoint adjusted_pos = old_pos - sm_to_ms_copy( submap_shift );
10330 start_hauling( adjusted_pos );
10331 }
10332
10333 m.invalidate_map_cache( g->get_levz() );
10334 // Upon force movement, traps can not be avoided.
10335 m.creature_on_trap( u, !force );
10336
10338}
static int move_cost(const item &it, const tripoint &src, const tripoint &dest)
@ CMM_WALK
Definition: character.h:102
@ CMM_CROUCH
Definition: character.h:104
bool move_effects(bool attacking) override
Processes effects which may prevent the Character from moving (bear traps, crushed,...
Definition: character.cpp:1590
int swim_speed() const
Returns the player's speed for swimming across water tiles.
Definition: character.cpp:937
int oxygen
Definition: character.h:1562
void mutation_spend_resources(const trait_id &mut)
Removes the appropriate costs (NOTE: will reapply mods & recalc sightlines in case of newly activated...
Definition: mutation.cpp:1713
int shoe_type_count(const itype_id &it) const
Returns 1 if the player is wearing an item of that count on one foot, 2 if on both,...
Definition: character.cpp:8857
std::string get_name() const override
Definition: character.cpp:5977
void set_underwater(bool x) override
void start_hauling(const tripoint &pos)
Definition: game.cpp:10340
cata::optional< tripoint > find_or_make_stairs(map &mp, int z_after, bool &rope_ladder, bool peeking)
Returns the other end of the stairs (if any).
Definition: game.cpp:10375
bool use_mech_power(int amt)
Definition: monster.cpp:2392
Character * mounted_player
Definition: monster.h:460
static const efftype_id effect_tied("tied")
static const itype_id itype_manhole_cover("manhole_cover")
static const skill_id skill_melee("melee")
static cata::optional< tripoint > point_selection_menu(const std::vector< tripoint > &pts)
Definition: game.cpp:9879
static const itype_id itype_swim_fins("swim_fins")
static const trait_id trait_WEB_ROPE("WEB_ROPE")
ter_id t_rope_up
Definition: mapdata.cpp:721
ter_id t_manhole
Definition: mapdata.cpp:720
bool can_use_mutation_warn(const trait_id &mut, const Character &character)
Calls can_use_mutation and if it fails, print a standard message.
Definition: mutation.cpp:1702
void avatar_moves(const avatar &u, const map &m, const tripoint &p)
Definition: game.cpp:12000
int ladder(player *, item *, bool, const tripoint &)
Definition: iuse.cpp:9354
int climbing_cost(const map &m, const tripoint &from, const tripoint &to)
Checks both the neighborhoods of from and to for climbable surfaces, returns move cost of climbing fr...
point displace(type dir, int dist=1)
Returns point(0, 0) displaced in specified direction by a specified distance.
Definition: overmap.cpp:4178

References _, active_npc, add_msg(), all_monsters(), cata_event_dispatch::avatar_moves(), c, can_use_mutation_warn(), map_funcs::climbing_cost(), closest_points_first(), CMM_CROUCH, CMM_RUN, CMM_WALK, coming_to_stairs, map::creature_on_trap(), critter_tracker, debugmsg, Character::dex_cur, dice(), om_direction::displace(), effect_pet, effect_ridden, effect_tied, find_empty_spot_nearby(), find_or_make_stairs(), monster::friendly, map::furn_set(), g, get_levx(), get_levy(), get_levz(), Character::get_name(), monster::get_name(), Character::get_skill_level(), avatar::grab(), player::grab_point, map::has_flag(), monster::has_flag(), map::has_floor_or_support(), map::has_furn(), Character::has_trait(), map::has_zlevels(), map::invalidate_map_cache(), npc::is_enemy(), Character::is_hauling(), Character::is_mounted(), Creature::is_underwater(), itype_manhole_cover, itype_swim_fins, iuse::ladder(), map::load(), m, m_bad, m_good, m_info, m_warning, MF_RIDEABLE_MECH, Creature::mod_moves(), monstairz, Character::mounted_creature, monster::mounted_player, npc::move_away_from(), move_cost(), map::move_cost(), Character::move_effects(), Character::movement_mode_is(), Creature::moves, Character::mutation_spend_resources(), om_direction::name(), OBJECT_NONE, OVERMAP_HEIGHT, Character::oxygen, map::passable(), point_selection_menu(), map::points_in_radius(), Character::pos(), Character::posx(), Character::posy(), Character::posz(), query_yn(), reload_npcs(), remove_zombie(), rl_dist(), rng(), Character::set_underwater(), Character::setpos(), monster::setpos(), shift_monsters(), Character::shoe_type_count(), skill_dodge, skill_melee, sm_to_ms_copy(), map::spawn_item(), start_hauling(), Character::stop_hauling(), Character::str_cur, Character::swim_speed(), t_manhole, t_manhole_cover, t_rope_up, map::ter(), map::ter_set(), map::tername(), TFLAG_DEEP_WATER, trait_WEB_ROPE, tripoint_zero, u, map::unboard_vehicle(), update_map(), update_stair_monsters(), monster::use_mech_power(), vertical_move(), vertical_shift(), Character::worn_with_flag(), tripoint::x, tripoint::xy(), and tripoint::y.

Referenced by handle_action(), peek(), and vertical_move().

◆ vertical_notes()

void game::vertical_notes ( int  z_before,
int  z_after 
)

Add goes up/down auto_notes (if turned on)

Definition at line 10562 of file game.cpp.

10563{
10564 if( z_before == z_after || !get_option<bool>( "AUTO_NOTES" ) ||
10565 !get_option<bool>( "AUTO_NOTES_STAIRS" ) ) {
10566 return;
10567 }
10568
10569 if( !m.inbounds_z( z_before ) || !m.inbounds_z( z_after ) ) {
10570 debugmsg( "game::vertical_notes invalid arguments: z_before == %d, z_after == %d",
10571 z_before, z_after );
10572 return;
10573 }
10574 // Figure out where we know there are up/down connectors
10575 // Fill in all the tiles we know about (e.g. subway stations)
10576 static const int REVEAL_RADIUS = 40;
10577 for( const tripoint_abs_omt &p : points_in_radius( u.global_omt_location(), REVEAL_RADIUS ) ) {
10578 const tripoint_abs_omt cursp_before( p.xy(), z_before );
10579 const tripoint_abs_omt cursp_after( p.xy(), z_after );
10580
10581 if( !overmap_buffer.seen( cursp_before ) ) {
10582 continue;
10583 }
10584 if( overmap_buffer.has_note( cursp_after ) ) {
10585 // Already has a note -> never add an AUTO-note
10586 continue;
10587 }
10588 const oter_id &ter = overmap_buffer.ter( cursp_before );
10589 const oter_id &ter2 = overmap_buffer.ter( cursp_after );
10590 if( z_after > z_before && ter->has_flag( known_up ) &&
10591 !ter2->has_flag( known_down ) ) {
10592 overmap_buffer.set_seen( cursp_after, true );
10593 overmap_buffer.add_note( cursp_after, string_format( ">:W;%s", _( "AUTO: goes down" ) ) );
10594 } else if( z_after < z_before && ter->has_flag( known_down ) &&
10595 !ter2->has_flag( known_up ) ) {
10596 overmap_buffer.set_seen( cursp_after, true );
10597 overmap_buffer.add_note( cursp_after, string_format( "<:W;%s", _( "AUTO: goes up" ) ) );
10598 }
10599 }
10600}
bool inbounds_z(const int z) const
Definition: map.h:1672
void add_note(const tripoint_abs_omt &, const std::string &message)
@ known_up
Definition: omdata.h:87
@ known_down
Definition: omdata.h:86
bool has_flag(oter_flags flag) const
Definition: omdata.h:258

References _, overmapbuffer::add_note(), debugmsg, Character::global_omt_location(), oter_t::has_flag(), overmapbuffer::has_note(), map::inbounds_z(), known_down, known_up, m, overmap_buffer, points_in_radius(), overmapbuffer::seen(), overmapbuffer::set_seen(), string_format(), overmapbuffer::ter(), and u.

Referenced by vertical_shift().

◆ vertical_shift()

void game::vertical_shift ( int  z_after)

Actual z-level movement part of vertical_move.

Doesn't include stair finding, traps etc.

Definition at line 10525 of file game.cpp.

10526{
10527 if( z_after < -OVERMAP_DEPTH || z_after > OVERMAP_HEIGHT ) {
10528 debugmsg( "Tried to get z-level %d outside allowed range of %d-%d",
10529 z_after, -OVERMAP_DEPTH, OVERMAP_HEIGHT );
10530 return;
10531 }
10532
10533 // TODO: Implement dragging stuff up/down
10534 u.grab( OBJECT_NONE );
10535
10536 scent.reset();
10537
10538 u.setz( z_after );
10539 const int z_before = get_levz();
10540 if( !m.has_zlevels() ) {
10542 m.access_cache( z_before ).vehicle_list.clear();
10543 m.access_cache( z_before ).zone_vehicles.clear();
10544 m.access_cache( z_before ).map_memory_seen_cache.reset();
10545 m.set_transparency_cache_dirty( z_before );
10546 m.set_outside_cache_dirty( z_before );
10547 m.load( tripoint( get_levx(), get_levy(), z_after ), true );
10548 shift_monsters( tripoint( 0, 0, z_after - z_before ) );
10549 reload_npcs();
10550 } else {
10551 // Shift the map itself
10552 m.vertical_shift( z_after );
10553 }
10554
10555 m.spawn_monsters( true );
10556 // this may be required after a vertical shift if z-levels are not enabled
10557 // the critter is unloaded/loaded, and it needs to reconstruct its rider data after being reloaded.
10559 vertical_notes( z_before, z_after );
10560}
void setz(int z)
Definition: character.h:828
void vertical_notes(int z_before, int z_after)
Add goes up/down auto_notes (if turned on)
Definition: game.cpp:10562
void set_transparency_cache_dirty(const int zlev)
Sets a dirty flag on the a given cache.
Definition: map.h:405
void set_outside_cache_dirty(const int zlev)
Definition: map.h:442
void vertical_shift(int newz)
Moves the map vertically to (not by!) newz.
Definition: map.cpp:6924
std::set< vehicle * > zone_vehicles
Definition: map.h:358
std::set< vehicle * > vehicle_list
Definition: map.h:357

References map::access_cache(), map::clear_vehicle_cache(), debugmsg, get_levx(), get_levy(), get_levz(), avatar::grab(), map::has_zlevels(), map::load(), m, level_cache::map_memory_seen_cache, OBJECT_NONE, OVERMAP_DEPTH, OVERMAP_HEIGHT, reload_npcs(), scent_map::reset(), scent, map::set_outside_cache_dirty(), map::set_transparency_cache_dirty(), Character::setz(), shift_monsters(), map::spawn_monsters(), u, validate_mounted_npcs(), level_cache::vehicle_list, vertical_notes(), map::vertical_shift(), and level_cache::zone_vehicles.

Referenced by place_player(), and vertical_move().

◆ walk_move()

bool game::walk_move ( const tripoint dest,
bool  via_ramp = false 
)

TODO: This should really use the mounted creatures stamina, if mounted. Monsters don't currently have stamina however. For the time being just don't burn players stamina when mounted.

Dexterity decreases chance of tentacles getting stuck to the ground Intelligence decreases chance of tentacles getting stuck to the ground

Definition at line 8719 of file game.cpp.

8720{
8721 if( m.has_flag_ter( TFLAG_SMALL_PASSAGE, dest_loc ) ) {
8722 if( u.get_size() > MS_MEDIUM ) {
8723 add_msg( m_warning, _( "You can't fit there." ) );
8724 return false; // character too large to fit through a tight passage
8725 }
8726 if( u.is_mounted() ) {
8727 monster *mount = u.mounted_creature.get();
8728 if( mount->get_size() > MS_MEDIUM ) {
8729 add_msg( m_warning, _( "Your mount can't fit there." ) );
8730 return false; // char's mount is too large for tight passages
8731 }
8732 }
8733 }
8734
8735 if( u.is_mounted() ) {
8736 auto mons = u.mounted_creature.get();
8737 if( mons->has_flag( MF_RIDEABLE_MECH ) ) {
8738 if( !mons->check_mech_powered() ) {
8739 add_msg( m_bad, _( "Your %s refuses to move as its batteries have been drained." ),
8740 mons->get_name() );
8741 return false;
8742 }
8743 }
8744 if( !mons->move_effects( false ) ) {
8745 add_msg( m_bad, _( "You cannot move as your %s isn't able to move." ), mons->get_name() );
8746 return false;
8747 }
8748 }
8749 const optional_vpart_position vp_here = m.veh_at( u.pos() );
8750 const optional_vpart_position vp_there = m.veh_at( dest_loc );
8751
8752 bool pushing = false; // moving -into- grabbed tile; skip check for move_cost > 0
8753 bool pulling = false; // moving -away- from grabbed tile; check for move_cost > 0
8754 bool shifting_furniture = false; // moving furniture and staying still; skip check for move_cost > 0
8755
8756 const tripoint furn_pos = u.pos() + u.grab_point;
8757 const tripoint furn_dest = dest_loc + u.grab_point;
8758
8759 bool grabbed = u.get_grab_type() != OBJECT_NONE;
8760 if( grabbed ) {
8761 const tripoint dp = dest_loc - u.pos();
8762 pushing = dp == u.grab_point;
8763 pulling = dp == -u.grab_point;
8764 }
8765 if( grabbed && dest_loc.z != u.posz() ) {
8766 add_msg( m_warning, _( "You let go of the grabbed object." ) );
8767 grabbed = false;
8768 u.grab( OBJECT_NONE );
8769 }
8770
8771 // Now make sure we're actually holding something
8772 const vehicle *grabbed_vehicle = nullptr;
8773 if( grabbed && u.get_grab_type() == OBJECT_FURNITURE ) {
8774 // We only care about shifting, because it's the only one that can change our destination
8775 if( m.has_furn( u.pos() + u.grab_point ) ) {
8776 shifting_furniture = !pushing && !pulling;
8777 } else {
8778 // We were grabbing a furniture that isn't there
8779 grabbed = false;
8780 }
8781 } else if( grabbed && u.get_grab_type() == OBJECT_VEHICLE ) {
8782 grabbed_vehicle = veh_pointer_or_null( m.veh_at( u.pos() + u.grab_point ) );
8783 if( grabbed_vehicle == nullptr ) {
8784 // We were grabbing a vehicle that isn't there anymore
8785 grabbed = false;
8786 }
8787 } else if( grabbed ) {
8788 // We were grabbing something WEIRD, let's pretend we weren't
8789 grabbed = false;
8790 }
8791 if( u.grab_point != tripoint_zero && !grabbed ) {
8792 add_msg( m_warning, _( "Can't find grabbed object." ) );
8793 u.grab( OBJECT_NONE );
8794 }
8795
8796 if( m.impassable( dest_loc ) && !pushing && !shifting_furniture ) {
8797 if( vp_there && u.mounted_creature && u.mounted_creature->has_flag( MF_RIDEABLE_MECH ) &&
8798 vp_there->vehicle().handle_potential_theft( dynamic_cast<player &>( u ) ) ) {
8799 tripoint diff = dest_loc - u.pos();
8800 if( diff.x < 0 ) {
8801 diff.x -= 2;
8802 } else if( diff.x > 0 ) {
8803 diff.x += 2;
8804 }
8805 if( diff.y < 0 ) {
8806 diff.y -= 2;
8807 } else if( diff.y > 0 ) {
8808 diff.y += 2;
8809 }
8810 u.mounted_creature->shove_vehicle( dest_loc + diff.xy(),
8811 dest_loc );
8812 }
8813 return false;
8814 }
8815 if( vp_there && !vp_there->vehicle().handle_potential_theft( dynamic_cast<player &>( u ) ) ) {
8816 return false;
8817 }
8818 if( u.is_mounted() && !pushing && vp_there ) {
8819 add_msg( m_warning, _( "You cannot board a vehicle whilst riding." ) );
8820 return false;
8821 }
8822 u.set_underwater( false );
8823
8824 if( !shifting_furniture && !pushing && is_dangerous_tile( dest_loc ) ) {
8825 std::vector<std::string> harmful_stuff = get_dangerous_tile( dest_loc );
8826 const auto dangerous_terrain_opt = get_option<std::string>( "DANGEROUS_TERRAIN_WARNING_PROMPT" );
8827 const auto harmful_text = enumerate_as_string( harmful_stuff );
8828 const auto warn_msg = [&]( const char *const msg ) {
8829 add_msg( m_warning, msg, harmful_text );
8830 };
8831
8832 if( dangerous_terrain_opt == "IGNORE" ) {
8833 warn_msg( _( "Stepping into that %1$s looks risky, but you enter anyway." ) );
8834 } else if( dangerous_terrain_opt == "ALWAYS" && !prompt_dangerous_tile( dest_loc ) ) {
8835 return true;
8836 } else if( dangerous_terrain_opt == "RUNNING" &&
8837 ( !u.movement_mode_is( CMM_RUN ) || !prompt_dangerous_tile( dest_loc ) ) ) {
8838 warn_msg( _( "Stepping into that %1$s looks risky. Run into it if you wish to enter anyway." ) );
8839 return true;
8840 } else if( dangerous_terrain_opt == "CROUCHING" &&
8841 ( !u.movement_mode_is( CMM_CROUCH ) || !prompt_dangerous_tile( dest_loc ) ) ) {
8842 warn_msg( _( "Stepping into that %1$s looks risky. Crouch and move into it if you wish to enter anyway." ) );
8843 return true;
8844 } else if( dangerous_terrain_opt == "NEVER" && !u.movement_mode_is( CMM_RUN ) ) {
8845 warn_msg( _( "Stepping into that %1$s looks risky. Run into it if you wish to enter anyway." ) );
8846 return true;
8847 }
8848 }
8849 // Used to decide whether to print a 'moving is slow message
8850 const int mcost_from = m.move_cost( u.pos() ); //calculate this _before_ calling grabbed_move
8851
8852 int modifier = 0;
8853 if( grabbed && u.get_grab_type() == OBJECT_FURNITURE && u.pos() + u.grab_point == dest_loc ) {
8854 modifier = -m.furn( dest_loc ).obj().movecost;
8855 }
8856
8857 int multiplier = 1;
8858 if( u.is_on_ground() ) {
8859 multiplier *= 3;
8860 }
8861
8862 const int mcost = m.combined_movecost( u.pos(), dest_loc, grabbed_vehicle, modifier,
8863 via_ramp ) * multiplier;
8864 if( grabbed_move( dest_loc - u.pos() ) ) {
8865 return true;
8866 } else if( mcost == 0 ) {
8867 return false;
8868 }
8869 bool diag = trigdist && u.posx() != dest_loc.x && u.posy() != dest_loc.y;
8870 const int previous_moves = u.moves;
8871 if( u.is_mounted() ) {
8872 auto crit = u.mounted_creature.get();
8873 if( !crit->has_flag( MF_RIDEABLE_MECH ) &&
8874 ( m.has_flag_ter_or_furn( "MOUNTABLE", dest_loc ) ||
8875 m.has_flag_ter_or_furn( "BARRICADABLE_DOOR", dest_loc ) ||
8876 m.has_flag_ter_or_furn( "OPENCLOSE_INSIDE", dest_loc ) ||
8877 m.has_flag_ter_or_furn( "BARRICADABLE_DOOR_DAMAGED", dest_loc ) ||
8878 m.has_flag_ter_or_furn( "BARRICADABLE_DOOR_REINFORCED", dest_loc ) ) ) {
8879 add_msg( m_warning, _( "You cannot pass obstacles whilst mounted." ) );
8880 return false;
8881 }
8882 const double base_moves = u.run_cost( mcost, diag ) * 100.0 / crit->get_speed();
8883 const double encumb_moves = u.get_weight() / 4800.0_gram;
8884 u.moves -= static_cast<int>( std::ceil( base_moves + encumb_moves ) );
8885 if( u.movement_mode_is( CMM_WALK ) ) {
8886 crit->use_mech_power( -2 );
8887 } else if( u.movement_mode_is( CMM_CROUCH ) ) {
8888 crit->use_mech_power( -1 );
8889 } else if( u.movement_mode_is( CMM_RUN ) ) {
8890 crit->use_mech_power( -3 );
8891 }
8892 } else {
8893 u.moves -= u.run_cost( mcost, diag );
8894 /**
8895 TODO:
8896 This should really use the mounted creatures stamina, if mounted.
8897 Monsters don't currently have stamina however.
8898 For the time being just don't burn players stamina when mounted.
8899 */
8900 if( grabbed_vehicle == nullptr || grabbed_vehicle->wheelcache.empty() ) {
8901 //Burn normal amount of stamina if no vehicle grabbed or vehicle lacks wheels
8902 u.burn_move_stamina( previous_moves - u.moves );
8903 } else {
8904 //Burn half as much stamina if vehicle has wheels, without changing move time
8905 u.burn_move_stamina( 0.50 * ( previous_moves - u.moves ) );
8906 }
8907 }
8908 // Max out recoil & reset aim point
8911
8912 // Print a message if movement is slow
8913 const int mcost_to = m.move_cost( dest_loc ); //calculate this _after_ calling grabbed_move
8914 const bool fungus = m.has_flag_ter_or_furn( "FUNGUS", u.pos() ) ||
8915 m.has_flag_ter_or_furn( "FUNGUS",
8916 dest_loc ); //fungal furniture has no slowing effect on mycus characters
8917 const bool slowed = ( ( !u.has_trait( trait_PARKOUR ) && ( mcost_to > 2 || mcost_from > 2 ) ) ||
8918 mcost_to > 4 || mcost_from > 4 ) &&
8919 !( u.has_trait( trait_M_IMMUNE ) && fungus );
8920 if( slowed && !u.is_mounted() ) {
8921 // Unless u.pos() has a higher movecost than dest_loc, state that dest_loc is the cause
8922 if( mcost_to >= mcost_from ) {
8923 if( auto displayed_part = vp_there.part_displayed() ) {
8924 add_msg( m_warning, _( "Moving onto this %s is slow!" ),
8925 displayed_part->part().name() );
8926 sfx::do_obstacle( displayed_part->part().info().get_id().str() );
8927 } else {
8928 add_msg( m_warning, _( "Moving onto this %s is slow!" ), m.name( dest_loc ) );
8929 sfx::do_obstacle( m.ter( dest_loc ).id().str() );
8930 }
8931 } else {
8932 if( auto displayed_part = vp_here.part_displayed() ) {
8933 add_msg( m_warning, _( "Moving off of this %s is slow!" ),
8934 displayed_part->part().name() );
8935 sfx::do_obstacle( displayed_part->part().info().get_id().str() );
8936 } else {
8937 add_msg( m_warning, _( "Moving off of this %s is slow!" ), m.name( u.pos() ) );
8938 sfx::do_obstacle( m.ter( u.pos() ).id().str() );
8939 }
8940 }
8941 }
8942 if( !u.is_mounted() && u.has_trait( trait_id( "LEG_TENT_BRACE" ) ) &&
8943 ( !u.footwear_factor() ||
8944 ( u.footwear_factor() == .5 && one_in( 2 ) ) ) ) {
8945 // DX and IN are long suits for Cephalopods,
8946 // so this shouldn't cause too much hardship
8947 // Presumed that if it's swimmable, they're
8948 // swimming and won't stick
8949 ///\EFFECT_DEX decreases chance of tentacles getting stuck to the ground
8950
8951 ///\EFFECT_INT decreases chance of tentacles getting stuck to the ground
8952 if( !m.has_flag( "SWIMMABLE", dest_loc ) && one_in( 80 + u.dex_cur + u.int_cur ) ) {
8953 add_msg( _( "Your tentacles stick to the ground, but you pull them free." ) );
8954 u.mod_fatigue( 1 );
8955 }
8956 }
8957 if( !u.has_artifact_with( AEP_STEALTH ) && !u.has_trait( trait_id( "DEBUG_SILENT" ) ) ) {
8958 int volume = u.is_stealthy() ? 3 : 6;
8959 volume *= u.mutation_value( "noise_modifier" );
8960 if( volume > 0 ) {
8962 volume = 2;
8963 } else if( u.has_bionic( bionic_id( "bio_ankles" ) ) ) {
8964 volume = 12;
8965 }
8966 if( u.movement_mode_is( CMM_RUN ) ) {
8967 volume *= 1.5;
8968 } else if( u.movement_mode_is( CMM_CROUCH ) ) {
8969 volume /= 2;
8970 }
8971 if( u.is_mounted() ) {
8972 auto mons = u.mounted_creature.get();
8973 switch( mons->get_size() ) {
8974 case MS_TINY:
8975 volume = 0; // No sound for the tinies
8976 break;
8977 case MS_SMALL:
8978 volume /= 3;
8979 break;
8980 case MS_MEDIUM:
8981 break;
8982 case MS_LARGE:
8983 volume *= 1.5;
8984 break;
8985 case MS_HUGE:
8986 volume *= 2;
8987 break;
8988 default:
8989 break;
8990 }
8991 if( mons->has_flag( MF_LOUDMOVES ) ) {
8992 volume += 6;
8993 }
8994 sounds::sound( dest_loc, volume, sounds::sound_t::movement, mons->type->get_footsteps(), false,
8995 "none", "none" );
8996 } else {
8997 sounds::sound( dest_loc, volume, sounds::sound_t::movement, _( "footsteps" ), true,
8998 "none", "none" ); // Sound of footsteps may awaken nearby monsters
8999 }
9001 }
9002
9003 if( one_in( 20 ) && u.has_artifact_with( AEP_MOVEMENT_NOISE ) ) {
9004 sounds::sound( u.pos(), 40, sounds::sound_t::movement, _( "a rattling sound." ), true,
9005 "misc", "rattling" );
9006 }
9007 }
9008
9009 if( m.has_flag_ter_or_furn( TFLAG_HIDE_PLACE, dest_loc ) ) {
9010 add_msg( m_good, _( "You are hiding in the %s." ), m.name( dest_loc ) );
9011 }
9012
9013 if( dest_loc != u.pos() ) {
9015 }
9016
9017 tripoint oldpos = u.pos();
9018 point submap_shift = place_player( dest_loc );
9019 point ms_shift = sm_to_ms_copy( submap_shift );
9020 oldpos = oldpos - ms_shift;
9021
9022 if( pulling ) {
9023 const tripoint shifted_furn_pos = furn_pos - ms_shift;
9024 const tripoint shifted_furn_dest = furn_dest - ms_shift;
9025 const time_duration fire_age = m.get_field_age( shifted_furn_pos, fd_fire );
9026 const int fire_intensity = m.get_field_intensity( shifted_furn_pos, fd_fire );
9027 m.remove_field( shifted_furn_pos, fd_fire );
9028 m.set_field_intensity( shifted_furn_dest, fd_fire, fire_intensity );
9029 m.set_field_age( shifted_furn_dest, fd_fire, fire_age );
9030 }
9031
9032 if( u.is_hauling() ) {
9033 start_hauling( oldpos );
9034 }
9035
9037
9038 return true;
9039}
void burn_move_stamina(int moves)
Definition: character.cpp:7135
bool is_stealthy() const
Returns true if the player has stealthy movement.
virtual bool has_artifact_with(art_effect_passive effect) const
Definition: character.cpp:3277
units::mass get_weight() const override
Returns body weight plus weight of inventory and worn/wielded items.
Definition: character.cpp:3676
bool is_on_ground() const override
Returns true if the player is knocked over or has broken legs.
Definition: character.cpp:1017
float mutation_value(const std::string &val) const
Goes over all mutations, gets min and max of a value with given name.
Definition: character.cpp:6663
int run_cost(int base_cost, bool diag=false) const
Returns the player's modified base movement cost.
Definition: character.cpp:9925
m_size get_size() const override
Get size class of character.
Definition: character.cpp:548
bool grabbed_move(const tripoint &dp)
Check for dangerous stuff at dest_loc, return false if the player decides not to step there.
Definition: game.cpp:9645
bool is_dangerous_tile(const tripoint &dest_loc) const
Definition: game.cpp:8648
const string_id< T > & id() const
Definition: ammo_effect.cpp:33
int combined_movecost(const tripoint &from, const tripoint &to, const vehicle *ignored_vehicle=nullptr, int modifier=0, bool flying=false, bool via_ramp=false) const
Cost to move out of one tile and into the next.
Definition: map.cpp:1838
m_size get_size() const override
Definition: monster.cpp:2692
cata::optional< vpart_reference > part_displayed() const
Definition: vehicle.cpp:2498
cata::optional< tripoint > last_target_pos
Definition: player.h:472
@ MS_TINY
Definition: creature.h:58
@ MS_LARGE
Definition: creature.h:61
@ MS_MEDIUM
Definition: creature.h:60
static const itype_id itype_rm13_armor_on("rm13_armor_on")
static const trait_id trait_M_IMMUNE("M_IMMUNE")
@ TFLAG_SMALL_PASSAGE
Definition: mapdata.h:320
@ TFLAG_HIDE_PLACE
Definition: mapdata.h:315
@ MF_LOUDMOVES
Definition: mtype.h:175
void fungus(player &p, const tripoint &examp)
Remove furniture.
Definition: iexamine.cpp:2221
void do_obstacle(const std::string &obst="")
Definition: sounds.cpp:1635
void do_footstep()
Definition: sounds.cpp:1612

References _, add_msg(), AEP_MOVEMENT_NOISE, AEP_STEALTH, cata_event_dispatch::avatar_moves(), Character::burn_move_stamina(), CMM_CROUCH, CMM_RUN, CMM_WALK, map::combined_movecost(), Character::dex_cur, sfx::do_footstep(), sfx::do_obstacle(), enumerate_as_string(), fd_fire, Character::footwear_factor(), iexamine::fungus(), map::furn(), get_dangerous_tile(), map::get_field_age(), map::get_field_intensity(), avatar::get_grab_type(), Character::get_size(), monster::get_size(), Character::get_weight(), avatar::grab(), player::grab_point, grabbed_move(), Character::has_artifact_with(), Character::has_bionic(), map::has_flag(), map::has_flag_ter(), map::has_flag_ter_or_furn(), map::has_furn(), Character::has_trait(), int_id< T >::id(), map::impassable(), Character::int_cur, is_dangerous_tile(), Character::is_hauling(), Character::is_mounted(), Character::is_on_ground(), Character::is_stealthy(), Character::is_wearing(), itype_rm13_armor_on, player::last_target_pos, m, m_bad, m_good, m_warning, MAX_RECOIL, MF_LOUDMOVES, MF_RIDEABLE_MECH, Character::mod_fatigue(), Character::mounted_creature, map::move_cost(), map_data_common_t::movecost, sounds::movement, Character::movement_mode_is(), Creature::moves, MS_HUGE, MS_LARGE, MS_MEDIUM, MS_SMALL, MS_TINY, Character::mutation_value(), map::name(), cata::nullopt, int_id< T >::obj(), OBJECT_FURNITURE, OBJECT_NONE, OBJECT_VEHICLE, on_move_effects(), one_in(), optional_vpart_position::part_displayed(), place_player(), Character::pos(), Character::posx(), Character::posy(), Character::posz(), prompt_dangerous_tile(), Character::recoil, map::remove_field(), Character::run_cost(), map::set_field_age(), map::set_field_intensity(), Character::set_underwater(), sm_to_ms_copy(), sounds::sound(), start_hauling(), string_id< T >::str(), map::ter(), TFLAG_HIDE_PLACE, TFLAG_SMALL_PASSAGE, trait_M_IMMUNE, trait_PARKOUR, trigdist, tripoint_zero, u, map::veh_at(), veh_pointer_or_null(), vehicle::wheelcache, tripoint::x, tripoint::xy(), tripoint::y, and tripoint::z.

Referenced by swap_critters().

◆ win()

void game::win ( )

Marks the game as won.

Doesn't end the game.

Definition at line 2420 of file game.cpp.

2421{
2422 win_screen();
2424 memorial().add(
2425 pgettext( "memorial_male", "Closed the portal in %1$.1f days (%2$d seconds)." ),
2426 pgettext( "memorial_female", "Closed the portal in %1$.1f days (%2$d seconds)." ),
2427 to_days<float>( game_duration ), to_seconds<int>( game_duration ) );
2428 if( !u.is_dead_state() ) {
2431 }
2432}
void win_screen()
Definition: game.cpp:2434
void add(const std::string &male_msg, const std::string &female_msg)
Adds an event to the memorial log, to be written to the memorial file when the character dies.
const time_point & start_of_game
Definition: calendar.cpp:34

References achievements_tracker_ptr, memorial_logger::add(), Messages::display_messages(), get_kill_tracker(), Character::is_dead_state(), memorial(), pgettext(), show_scores_ui(), calendar::start_of_game, stats(), calendar::turn, u, and win_screen().

◆ win_screen()

void game::win_screen ( )
private

Definition at line 2434 of file game.cpp.

2435{
2436 // TODO: Move this wall somewhere
2438 std::string msg = _( "You managed to close the portal and end the invasion!" );
2439 msg += '\n';
2440 if( u.is_dead_state() ) {
2442 "Unfortunately, you had to sacrifice your life to achieve this." );
2443 msg += colorize( t, c_red ) + '\n';
2444 memorial().add(
2445 pgettext( "memorial_male", "Sacrificed his life to close the portal." ),
2446 pgettext( "memorial_female", "Sacrificed her life to close the portal." ) );
2447 } else {
2448 translation t = translation::to_translation( "win_game", "You managed to survive the ordeal." );
2449 msg += colorize( t, c_green ) + '\n';
2450 memorial().add(
2451 pgettext( "memorial_male", "Safely closed the portal." ),
2452 pgettext( "memorial_female", "Safely closed the portal." ) );
2453 }
2454 msg += string_format( _( "It took you %1$.1f days (%2$d seconds)." ),
2455 to_days<float>( game_duration ), to_seconds<int>( game_duration ) );
2456 // TODO: Print starting stats, traits, skills, all mods ever used, easiest of settings
2457 popup( msg );
2458}
Class for storing translation context and raw string for deferred translation.
Definition: translations.h:152
static translation to_translation(const std::string &raw)
Store a string, an optional plural form, and an optional context for translation.
std::string colorize(const std::string &text, const nc_color &color)
Definition: color.cpp:669

References _, memorial_logger::add(), c_green, c_red, colorize(), Character::is_dead_state(), memorial(), pgettext(), popup(), calendar::start_of_game, string_format(), translation::to_translation(), calendar::turn, and u.

Referenced by win().

◆ write_memorial_file()

void game::write_memorial_file ( const std::string &  filename,
std::string  sLastWords 
)

Writes information about the character out to a text file timestamped with the time of the file was made.

This serves as a record of the character's state at the time the memorial was made (usually upon death) and accomplishments in a human-readable format.

Definition at line 2759 of file game.cpp.

2760{
2761 const std::string &memorial_dir = PATH_INFO::memorialdir();
2762 const std::string &memorial_active_world_dir = memorial_dir +
2763 world_generator->active_world->world_name + "/";
2764
2765 //Check if both dirs exist. Nested assure_dir_exist fails if the first dir of the nested dir does not exist.
2766 if( !assure_dir_exist( memorial_dir ) ) {
2767 debugmsg( "Could not make '%s' directory", memorial_dir );
2768 return;
2769 }
2770
2771 if( !assure_dir_exist( memorial_active_world_dir ) ) {
2772 debugmsg( "Could not make '%s' directory", memorial_active_world_dir );
2773 return;
2774 }
2775
2776 std::string path = memorial_active_world_dir + filename + ".txt";
2777
2778 write_to_file( path, [&]( std::ostream & fout ) {
2779 memorial().write( fout, sLastWords );
2780 }, _( "player memorial" ) );
2781}
void write(std::ostream &memorial_file, const std::string &epitaph) const
std::string memorialdir()
Definition: path_info.cpp:230

References _, assure_dir_exist(), debugmsg, memorial(), PATH_INFO::memorialdir(), world_generator, memorial_logger::write(), and write_to_file().

Referenced by cleanup_at_end().

◆ zones_manager()

void game::zones_manager ( )

Definition at line 6058 of file game.cpp.

6059{
6060 const tripoint stored_view_offset = u.view_offset;
6061
6063
6064 const int zone_ui_height = 12;
6065 const int zone_options_height = 7;
6066
6067 const int width = 45;
6068
6069 int offsetX = 0;
6070 int max_rows = 0;
6071
6072 catacurses::window w_zones;
6073 catacurses::window w_zones_border;
6074 catacurses::window w_zones_info;
6075 catacurses::window w_zones_info_border;
6076 catacurses::window w_zones_options;
6077
6078 bool show = true;
6079
6080 ui_adaptor ui;
6081 ui.on_screen_resize( [&]( ui_adaptor & ui ) {
6082 if( !show ) {
6083 ui.position( point_zero, point_zero );
6084 return;
6085 }
6086 offsetX = get_option<std::string>( "SIDEBAR_POSITION" ) != "left" ?
6087 TERMX - width : 0;
6088 const int w_zone_height = TERMY - zone_ui_height;
6089 max_rows = w_zone_height - 2;
6090 w_zones = catacurses::newwin( w_zone_height - 2, width - 2,
6091 point( offsetX + 1, 1 ) );
6092 w_zones_border = catacurses::newwin( w_zone_height, width,
6093 point( offsetX, 0 ) );
6094 w_zones_info = catacurses::newwin( zone_ui_height - zone_options_height - 1,
6095 width - 2, point( offsetX + 1, w_zone_height ) );
6096 w_zones_info_border = catacurses::newwin( zone_ui_height, width,
6097 point( offsetX, w_zone_height ) );
6098 w_zones_options = catacurses::newwin( zone_options_height - 1, width - 2,
6099 point( offsetX + 1, TERMY - zone_options_height ) );
6100
6101 ui.position( point( offsetX, 0 ), point( width, TERMY ) );
6102 } );
6103 ui.mark_resize();
6104
6105 std::string action;
6106 input_context ctxt( "ZONES_MANAGER" );
6107 ctxt.register_cardinal();
6108 ctxt.register_action( "CONFIRM" );
6109 ctxt.register_action( "QUIT" );
6110 ctxt.register_action( "ADD_ZONE" );
6111 ctxt.register_action( "REMOVE_ZONE" );
6112 ctxt.register_action( "MOVE_ZONE_UP" );
6113 ctxt.register_action( "MOVE_ZONE_DOWN" );
6114 ctxt.register_action( "SHOW_ZONE_ON_MAP" );
6115 ctxt.register_action( "ENABLE_ZONE" );
6116 ctxt.register_action( "DISABLE_ZONE" );
6117 ctxt.register_action( "SHOW_ALL_ZONES" );
6118 ctxt.register_action( "HELP_KEYBINDINGS" );
6119
6120 auto &mgr = zone_manager::get_manager();
6121 int start_index = 0;
6122 int active_index = 0;
6123 bool blink = false;
6124 bool stuff_changed = false;
6125 bool show_all_zones = false;
6126 int zone_cnt = 0;
6127
6128 // get zones on the same z-level, with distance between player and
6129 // zone center point <= 50 or all zones, if show_all_zones is true
6130 auto get_zones = [&]() {
6131 std::vector<zone_manager::ref_zone_data> zones;
6132 if( show_all_zones ) {
6133 zones = mgr.get_zones();
6134 } else {
6135 const tripoint &u_abs_pos = m.getabs( u.pos() );
6136 for( zone_manager::ref_zone_data &ref : mgr.get_zones() ) {
6137 const tripoint &zone_abs_pos = ref.get().get_center_point();
6138 if( u_abs_pos.z == zone_abs_pos.z && rl_dist( u_abs_pos, zone_abs_pos ) <= 50 ) {
6139 zones.emplace_back( ref );
6140 }
6141 }
6142 }
6143 zone_cnt = static_cast<int>( zones.size() );
6144 return zones;
6145 };
6146
6147 auto zones = get_zones();
6148
6149 auto zones_manager_options = [&]() {
6150 werase( w_zones_options );
6151
6152 if( zone_cnt > 0 ) {
6153 const auto &zone = zones[active_index].get();
6154
6155 if( zone.has_options() ) {
6156 const auto &descriptions = zone.get_options().get_descriptions();
6157
6158 // NOLINTNEXTLINE(cata-use-named-point-constants)
6159 mvwprintz( w_zones_options, point( 1, 0 ), c_white, _( "Options" ) );
6160
6161 int y = 1;
6162 for( const auto &desc : descriptions ) {
6163 mvwprintz( w_zones_options, point( 3, y ), c_white, desc.first );
6164 mvwprintz( w_zones_options, point( 20, y ), c_white, desc.second );
6165 y++;
6166 }
6167 }
6168 }
6169
6170 wnoutrefresh( w_zones_options );
6171 };
6172
6173 cata::optional<tripoint> zone_start;
6174 cata::optional<tripoint> zone_end;
6175 bool zone_blink = false;
6176 bool zone_cursor = false;
6178 zone_start, zone_end, zone_blink, zone_cursor );
6179 add_draw_callback( zone_cb );
6180
6181 auto query_position =
6182 [&]() -> cata::optional<std::pair<tripoint, tripoint>> {
6183 on_out_of_scope invalidate_current_ui( [&]()
6184 {
6185 ui.mark_resize();
6186 } );
6187 restore_on_out_of_scope<bool> show_prev( show );
6188 restore_on_out_of_scope<cata::optional<tripoint>> zone_start_prev( zone_start );
6189 restore_on_out_of_scope<cata::optional<tripoint>> zone_end_prev( zone_end );
6190 show = false;
6191 zone_start = cata::nullopt;
6192 zone_end = cata::nullopt;
6193 ui.mark_resize();
6194
6196 popup.on_top( true );
6197 popup.message( "%s", _( "Select first point." ) );
6198
6200
6201 const look_around_result first = look_around( /*show_window=*/false, center, center, false, true,
6202 false );
6203 if( first.position )
6204 {
6205 popup.message( "%s", _( "Select second point." ) );
6206
6207 const look_around_result second = look_around( /*show_window=*/false, center, *first.position,
6208 true, true, false );
6209 if( second.position ) {
6210 tripoint first_abs = m.getabs( tripoint( std::min( first.position->x,
6211 second.position->x ),
6212 std::min( first.position->y, second.position->y ),
6213 std::min( first.position->z,
6214 second.position->z ) ) );
6215 tripoint second_abs = m.getabs( tripoint( std::max( first.position->x,
6216 second.position->x ),
6217 std::max( first.position->y, second.position->y ),
6218 std::max( first.position->z,
6219 second.position->z ) ) );
6220 return std::pair<tripoint, tripoint>( first_abs, second_abs );
6221 }
6222 }
6223
6224 return cata::nullopt;
6225 };
6226
6227 ui.on_redraw( [&]( const ui_adaptor & ) {
6228 if( !show ) {
6229 return;
6230 }
6231 zones_manager_draw_borders( w_zones_border, w_zones_info_border, zone_ui_height, width );
6232 zones_manager_shortcuts( w_zones_info );
6233
6234 if( zone_cnt == 0 ) {
6235 werase( w_zones );
6236 mvwprintz( w_zones, point( 2, 5 ), c_white, _( "No Zones defined." ) );
6237
6238 } else {
6239 werase( w_zones );
6240
6241 calcStartPos( start_index, active_index, max_rows, zone_cnt );
6242
6243 draw_scrollbar( w_zones_border, active_index, max_rows, zone_cnt, point_south );
6244 wnoutrefresh( w_zones_border );
6245
6246 int iNum = 0;
6247
6248 tripoint player_absolute_pos = m.getabs( u.pos() );
6249
6250 //Display saved zones
6251 for( auto &i : zones ) {
6252 if( iNum >= start_index &&
6253 iNum < start_index + ( ( max_rows > zone_cnt ) ? zone_cnt : max_rows ) ) {
6254 const auto &zone = i.get();
6255
6256 nc_color colorLine = ( zone.get_enabled() ) ? c_white : c_light_gray;
6257
6258 if( iNum == active_index ) {
6259 mvwprintz( w_zones, point( 0, iNum - start_index ), c_yellow, "%s", ">>" );
6260 colorLine = ( zone.get_enabled() ) ? c_light_green : c_green;
6261 }
6262
6263 //Draw Zone name
6264 mvwprintz( w_zones, point( 3, iNum - start_index ), colorLine,
6265 trim_by_length( zone.get_name(), 15 ) );
6266
6267 //Draw Type name
6268 mvwprintz( w_zones, point( 20, iNum - start_index ), colorLine,
6269 mgr.get_name_from_type( zone.get_type() ) );
6270
6271 tripoint center = zone.get_center_point();
6272
6273 //Draw direction + distance
6274 mvwprintz( w_zones, point( 32, iNum - start_index ), colorLine, "%*d %s",
6275 5, static_cast<int>( trig_dist( player_absolute_pos, center ) ),
6276 direction_name_short( direction_from( player_absolute_pos,
6277 center ) ) );
6278
6279 //Draw Vehicle Indicator
6280 mvwprintz( w_zones, point( 41, iNum - start_index ), colorLine,
6281 zone.get_is_vehicle() ? "*" : "" );
6282 }
6283 iNum++;
6284 }
6285
6286 // Display zone options
6287 zones_manager_options();
6288 }
6289
6290 wnoutrefresh( w_zones );
6291 } );
6292
6293 zones_manager_open = true;
6294 do {
6295 if( action == "ADD_ZONE" ) {
6296 do { // not a loop, just for quick bailing out if canceled
6297 const auto maybe_id = mgr.query_type();
6298 if( !maybe_id.has_value() ) {
6299 break;
6300 }
6301
6302 const zone_type_id &id = maybe_id.value();
6303 auto options = zone_options::create( id );
6304
6305 if( !options->query_at_creation() ) {
6306 break;
6307 }
6308
6309 auto default_name = options->get_zone_name_suggestion();
6310 if( default_name.empty() ) {
6311 default_name = mgr.get_name_from_type( id );
6312 }
6313 const auto maybe_name = mgr.query_name( default_name );
6314 if( !maybe_name.has_value() ) {
6315 break;
6316 }
6317 const std::string &name = maybe_name.value();
6318
6319 const auto position = query_position();
6320 if( !position ) {
6321 break;
6322 }
6323
6324 mgr.add( name, id, g->u.get_faction()->id, false, true, position->first,
6325 position->second, options );
6326
6327 zones = get_zones();
6328 active_index = zone_cnt - 1;
6329
6330 stuff_changed = true;
6331 } while( false );
6332
6333 blink = false;
6334 } else if( action == "SHOW_ALL_ZONES" ) {
6335 show_all_zones = !show_all_zones;
6336 zones = get_zones();
6337 active_index = 0;
6338 } else if( zone_cnt > 0 ) {
6339 if( action == "UP" ) {
6340 active_index--;
6341 if( active_index < 0 ) {
6342 active_index = zone_cnt - 1;
6343 }
6344 blink = false;
6345 } else if( action == "DOWN" ) {
6346 active_index++;
6347 if( active_index >= zone_cnt ) {
6348 active_index = 0;
6349 }
6350 blink = false;
6351 } else if( action == "REMOVE_ZONE" ) {
6352 if( active_index < zone_cnt ) {
6353 mgr.remove( zones[active_index] );
6354 zones = get_zones();
6355 active_index--;
6356
6357 if( active_index < 0 ) {
6358 active_index = 0;
6359 }
6360 }
6361 blink = false;
6362 stuff_changed = true;
6363
6364 } else if( action == "CONFIRM" ) {
6365 auto &zone = zones[active_index].get();
6366
6367 uilist as_m;
6368 as_m.text = _( "What do you want to change:" );
6369 as_m.entries.emplace_back( 1, true, '1', _( "Edit name" ) );
6370 as_m.entries.emplace_back( 2, true, '2', _( "Edit type" ) );
6371 as_m.entries.emplace_back( 3, zone.get_options().has_options(), '3',
6372 zone.get_type() == zone_type_id( "LOOT_CUSTOM" ) ? _( "Edit filter" ) : _( "Edit options" ) );
6373 as_m.entries.emplace_back( 4, !zone.get_is_vehicle(), '4', _( "Edit position" ) );
6374 // TODO: Enable moving vzone after vehicle zone can be bigger than 1*1
6375 as_m.entries.emplace_back( 5, !zone.get_is_vehicle(), '5', _( "Move position" ) );
6376 as_m.query();
6377
6378 switch( as_m.ret ) {
6379 case 1:
6380 if( zone.set_name() ) {
6381 stuff_changed = true;
6382 }
6383 break;
6384 case 2:
6385 if( zone.set_type() ) {
6386 stuff_changed = true;
6387 }
6388 break;
6389 case 3:
6390 if( zone.get_options().query() ) {
6391 stuff_changed = true;
6392 }
6393 break;
6394 case 4: {
6395 const auto pos = query_position();
6396 if( pos && ( pos->first != zone.get_start_point() ||
6397 pos->second != zone.get_end_point() ) ) {
6398 zone.set_position( *pos );
6399 stuff_changed = true;
6400 }
6401 break;
6402 }
6403 case 5: {
6404 on_out_of_scope invalidate_current_ui( [&]() {
6405 ui.mark_resize();
6406 } );
6407 restore_on_out_of_scope<bool> show_prev( show );
6408 restore_on_out_of_scope<cata::optional<tripoint>> zone_start_prev( zone_start );
6409 restore_on_out_of_scope<cata::optional<tripoint>> zone_end_prev( zone_end );
6410 show = false;
6411 zone_start = cata::nullopt;
6412 zone_end = cata::nullopt;
6413 ui.mark_resize();
6414 static_popup message_pop;
6415 message_pop.on_top( true );
6416 message_pop.message( "%s", _( "Moving zone." ) );
6417 const auto zone_local_start_point = m.getlocal( zone.get_start_point() );
6418 const auto zone_local_end_point = m.getlocal( zone.get_end_point() );
6419 // local position of the zone center, used to calculate the u.view_offset,
6420 // could center the screen to the position it represents
6421 auto view_center = m.getlocal( zone.get_center_point() );
6422 const look_around_result result_local = look_around( false, view_center,
6423 zone_local_start_point, false, false,
6424 false, true, zone_local_end_point );
6425 if( result_local.position ) {
6426 const auto new_start_point = m.getabs( *result_local.position );
6427 if( new_start_point == zone.get_start_point() ) {
6428 break; // Nothing changed, don't save
6429 }
6430
6431 const auto new_end_point = zone.get_end_point() - zone.get_start_point() + new_start_point;
6432 zone.set_position( std::pair<tripoint, tripoint>( new_start_point, new_end_point ) );
6433 stuff_changed = true;
6434 }
6435 }
6436 break;
6437 default:
6438 break;
6439 }
6440
6441 blink = false;
6442 } else if( action == "MOVE_ZONE_UP" && zone_cnt > 1 ) {
6443 if( active_index < zone_cnt - 1 ) {
6444 mgr.swap( zones[active_index], zones[active_index + 1] );
6445 zones = get_zones();
6446 active_index++;
6447 }
6448 blink = false;
6449 stuff_changed = true;
6450
6451 } else if( action == "MOVE_ZONE_DOWN" && zone_cnt > 1 ) {
6452 if( active_index > 0 ) {
6453 mgr.swap( zones[active_index], zones[active_index - 1] );
6454 zones = get_zones();
6455 active_index--;
6456 }
6457 blink = false;
6458 stuff_changed = true;
6459
6460 } else if( action == "SHOW_ZONE_ON_MAP" ) {
6461 //show zone position on overmap;
6462 tripoint_abs_omt player_overmap_position = u.global_omt_location();
6463 // TODO: fix point types
6464 tripoint_abs_omt zone_overmap( ms_to_omt_copy( zones[active_index].get().get_center_point() ) );
6465
6466 ui::omap::display_zones( player_overmap_position, zone_overmap, active_index );
6467 } else if( action == "ENABLE_ZONE" ) {
6468 zones[active_index].get().set_enabled( true );
6469
6470 stuff_changed = true;
6471
6472 } else if( action == "DISABLE_ZONE" ) {
6473 zones[active_index].get().set_enabled( false );
6474
6475 stuff_changed = true;
6476 }
6477 }
6478
6479 if( zone_cnt > 0 ) {
6480 blink = !blink;
6481 const auto &zone = zones[active_index].get();
6482 zone_start = m.getlocal( zone.get_start_point() );
6483 zone_end = m.getlocal( zone.get_end_point() );
6484 ctxt.set_timeout( get_option<int>( "BLINK_SPEED" ) );
6485 } else {
6486 blink = false;
6487 zone_start = zone_end = cata::nullopt;
6488 ctxt.reset_timeout();
6489 }
6490
6491 // Actually accessed from the terrain overlay callback `zone_cb` in the
6492 // call to `ui_manager::redraw`.
6493 //NOLINTNEXTLINE(clang-analyzer-deadcode.DeadStores)
6494 zone_blink = blink;
6496
6498
6499 //Wait for input
6500 action = ctxt.handle_input();
6501 } while( action != "QUIT" );
6502 zones_manager_open = false;
6503 ctxt.reset_timeout();
6504 zone_cb = nullptr;
6505
6506 if( stuff_changed ) {
6507 auto &zones = zone_manager::get_manager();
6508 if( query_yn( _( "Save changes?" ) ) ) {
6509 zones.save_zones();
6510 } else {
6511 zones.load_zones();
6512 }
6513
6514 zones.cache_data();
6515 }
6516
6517 u.view_offset = stored_view_offset;
6518}
query_popup & on_top(bool top)
Whether to show the popup on the top of the screen.
Definition: popup.cpp:59
std::reference_wrapper< zone_data > ref_zone_data
Definition: clzones.h:342
static shared_ptr_fast< zone_options > create(const zone_type_id &type)
Definition: clzones.cpp:186
int trig_dist(const coords::coord_point< Point, Origin, Scale > &loc1, const coords::coord_point< Point, Origin, Scale > &loc2)
Definition: coordinates.h:512
static void zones_manager_shortcuts(const catacurses::window &w_info)
Definition: game.cpp:5993
static void zones_manager_draw_borders(const catacurses::window &w_border, const catacurses::window &w_info_border, const int iInfoHeight, const int width)
Definition: game.cpp:6016
std::string options()
Definition: path_info.cpp:238
const std::set< itype_id > & get()
void display_zones(const tripoint_abs_omt &center, const tripoint_abs_omt &select, int iZoneIndex)
Display overmap like with display() and display the given zone.
std::string trim_by_length(const std::string &text, int width)
Definition: output.cpp:224
cata::optional< tripoint > position
Definition: game.h:127

References _, action, add_draw_callback(), c_green, c_light_gray, c_light_green, c_white, c_yellow, calcStartPos(), center, zone_options::create(), create_zone_callback(), direction_from(), direction_name_short(), ui::omap::display_zones(), draw_scrollbar(), uilist::entries, g, charge_removal_blacklist::get(), zone_manager::get_manager(), map::getabs(), map::getlocal(), Character::global_omt_location(), input_context::handle_input(), invalidate_main_ui_adaptor(), look_around(), m, query_popup::message(), ms_to_omt_copy(), mvwprintz(), om_direction::name(), catacurses::newwin(), cata::nullopt, query_popup::on_top(), PATH_INFO::options(), point_south, point_zero, popup(), Character::pos(), look_around_result::position, uilist::query(), query_yn(), ui_manager::redraw(), input_context::register_action(), input_context::register_cardinal(), input_context::reset_timeout(), uilist::ret, rl_dist(), second, input_context::set_timeout(), TERMX, TERMY, uilist::text, trig_dist(), trim_by_length(), tripoint_zero, u, player::view_offset, catacurses::werase(), catacurses::wnoutrefresh(), tripoint::z, zones_manager_draw_borders(), zones_manager_open, and zones_manager_shortcuts().

Referenced by handle_action().

◆ zoom_in()

void game::zoom_in ( )

Definition at line 7020 of file game.cpp.

7021{
7022#if defined(TILES)
7023 if( tileset_zoom == 64 ) {
7024 tileset_zoom = MAXIMUM_ZOOM_LEVEL;
7025 } else {
7027 }
7028 rescale_tileset( tileset_zoom );
7029#endif
7030}

References tileset_zoom.

Referenced by handle_action(), and look_around().

◆ zoom_out()

void game::zoom_out ( )

Definition at line 7008 of file game.cpp.

7009{
7010#if defined(TILES)
7011 if( tileset_zoom > MAXIMUM_ZOOM_LEVEL ) {
7013 } else {
7014 tileset_zoom = 64;
7015 }
7016 rescale_tileset( tileset_zoom );
7017#endif
7018}

References tileset_zoom.

Referenced by handle_action(), and look_around().

Friends And Related Function Documentation

◆ advanced_inventory

friend class advanced_inventory
friend

Definition at line 146 of file game.h.

◆ Creature_range

friend class Creature_range
friend

Definition at line 334 of file game.h.

Referenced by all_creatures().

◆ editmap

friend class editmap
friend

Definition at line 145 of file game.h.

◆ get_avatar

avatar & get_avatar ( )
friend

Definition at line 104 of file avatar.cpp.

105{
106 return g->u;
107}

Referenced by butcher_submenu().

◆ get_distribution_grid_tracker

distribution_grid_tracker & get_distribution_grid_tracker ( )
friend

Returns distribution grid tracker that is a part of the global game *g.

game TODO: This wouldn't be required in an ideal world

Definition at line 12016 of file game.cpp.

12017{
12018 return *g->grid_tracker_ptr;
12019}

◆ get_map

map & get_map ( )
friend

◆ get_player_character

Character & get_player_character ( )
friend

Definition at line 388 of file character.cpp.

389{
390 return g->u;
391}

◆ get_weather

weather_manager & get_weather ( )
friend

Definition at line 64 of file weather.cpp.

65{
66 return *g->weather_manager_ptr;
67}

Referenced by do_turn(), get_player_input(), is_in_sunlight(), load(), natural_light_level(), place_player_overmap(), serialize_master(), setup(), start_game(), and unserialize_master().

◆ main_menu

friend class main_menu
friend

Definition at line 147 of file game.h.

◆ monster_range

friend class monster_range
friend

Definition at line 333 of file game.h.

Referenced by all_monsters().

Member Data Documentation

◆ achievements_tracker_ptr

pimpl<achievements_tracker> game::achievements_tracker_ptr
private

Definition at line 955 of file game.h.

Referenced by death_screen(), game(), handle_action(), serialize(), setup(), unserialize(), and win().

◆ active_npc

◆ auto_travel_mode

bool game::auto_travel_mode = false

Definition at line 1018 of file game.h.

Referenced by handle_action(), serialize(), and unserialize().

◆ bVMonsterLookFire

bool game::bVMonsterLookFire = false
private

Definition at line 1035 of file game.h.

Referenced by list_monsters(), look_around(), and setup().

◆ coming_to_stairs

std::vector<monster> game::coming_to_stairs

◆ critter_died

bool game::critter_died = false
private

Has anything died in this turn and needs to be cleaned up?

Definition at line 1049 of file game.h.

Referenced by cleanup_dead(), and set_critter_died().

◆ critter_tracker

◆ debug_hour_timer

◆ debug_pathfinding

bool game::debug_pathfinding = false

Definition at line 999 of file game.h.

◆ debug_submap_grid_overlay

bool game::debug_submap_grid_overlay = false

Definition at line 1000 of file game.h.

◆ destination_preview

std::vector<tripoint> game::destination_preview
private

◆ displaying_lighting_condition

int game::displaying_lighting_condition = 0

Type of lighting condition overlay to display.

Definition at line 1012 of file game.h.

◆ displaying_overlays

cata::optional<action_id> game::displaying_overlays
private

Definition at line 919 of file game.h.

Referenced by display_overlay_state(), and display_toggle_overlay().

◆ displaying_visibility_creature

Creature* game::displaying_visibility_creature

Creature for which to display the visibility map.

Definition at line 1010 of file game.h.

Referenced by display_visibility().

◆ draw_callbacks

std::vector<weak_ptr_fast<draw_callback_t> > game::draw_callbacks
private

Definition at line 225 of file game.h.

Referenced by add_draw_callback(), and draw().

◆ driving_view_offset

point game::driving_view_offset

Definition at line 997 of file game.h.

Referenced by calc_driving_offset(), do_turn(), handle_action(), and set_driving_view_offset().

◆ event_bus_ptr

pimpl<event_bus> game::event_bus_ptr
private

Definition at line 953 of file game.h.

Referenced by events().

◆ faction_manager_ptr

◆ first_redraw_since_waiting_started

bool game::first_redraw_since_waiting_started = true
private

Is this the first redraw since waiting (sleeping or activity) started.

Definition at line 1051 of file game.h.

Referenced by do_turn(), and game().

◆ follower_ids

std::set<character_id> game::follower_ids
private

◆ fullscreen

bool game::fullscreen = false

◆ gamemode

std::unique_ptr<special_game> game::gamemode
private

◆ grid_tracker_ptr

pimpl<distribution_grid_tracker> game::grid_tracker_ptr
private

Definition at line 959 of file game.h.

Referenced by do_turn(), load_map(), on_options_changed(), and update_map().

◆ is_looking

bool game::is_looking = false
private

Definition at line 224 of file game.h.

Referenced by draw_ter(), and look_around().

◆ kill_tracker_ptr

pimpl<kill_tracker> game::kill_tracker_ptr
private

Definition at line 956 of file game.h.

Referenced by game(), get_kill_tracker(), serialize(), setup(), and unserialize().

◆ last_mouse_edge_scroll

std::chrono::time_point<std::chrono::steady_clock> game::last_mouse_edge_scroll
private

Definition at line 1068 of file game.h.

Referenced by mouse_edge_scrolling().

◆ last_mouse_edge_scroll_vector_overmap

tripoint game::last_mouse_edge_scroll_vector_overmap
private

Definition at line 1070 of file game.h.

Referenced by mouse_edge_scrolling_overmap(), and mouse_edge_scrolling_terrain().

◆ last_mouse_edge_scroll_vector_terrain

tripoint game::last_mouse_edge_scroll_vector_terrain
private

Definition at line 1069 of file game.h.

Referenced by mouse_edge_scrolling_overmap(), and mouse_edge_scrolling_terrain().

◆ last_save_timestamp

time_t game::last_save_timestamp
private

Definition at line 1041 of file game.h.

Referenced by autosave(), init_autosave(), and quicksave().

◆ latest_lightlevels

std::array<float, OVERMAP_LAYERS> game::latest_lightlevels
mutableprivate

Definition at line 1042 of file game.h.

Referenced by natural_light_level(), and reset_light_level().

◆ list_item_downvote

std::string game::list_item_downvote
private

Definition at line 1032 of file game.h.

Referenced by list_items().

◆ list_item_upvote

std::string game::list_item_upvote
private

Definition at line 1031 of file game.h.

Referenced by list_items().

◆ liveview

live_view& game::liveview
private

Definition at line 950 of file game.h.

Referenced by draw_look_around_cursor(), and handle_mouseview().

◆ liveview_ptr

pimpl<live_view> game::liveview_ptr
private

Definition at line 949 of file game.h.

◆ m

map& game::m

Definition at line 963 of file game.h.

Referenced by autopilot_vehicles(), cata_event_dispatch::avatar_moves(), butcher(), catch_a_monster(), chat(), check_near_zone(), check_zone(), control_vehicle(), delete_cyborg_item(), disable_robot(), disp_NPCs(), do_turn(), draw(), draw_bullet(), draw_critter(), draw_critter_highlighted(), draw_critter_internal(), draw_hit_mon(), draw_look_around_cursor(), draw_ter(), examine(), extended_description(), find_nearby_items(), find_or_make_stairs(), fling_creature(), forced_door_closing(), get_cur_om(), get_dangerous_tile(), get_fishable_locations(), get_levx(), get_levy(), get_levz(), get_player_input(), get_veh_dir_indicator_location(), grabbed_furn_move(), grabbed_veh_move(), handle_action(), is_empty(), is_game_over(), is_in_sunlight(), is_sheltered(), knockback(), list_items(), list_monsters(), load(), load_map(), load_npcs(), look_around(), mon_info_update(), monmove(), moving_vehicle_dismount(), peek(), perhaps_add_random_npc(), phasing_move(), pickup(), place_critter_around(), place_player(), place_player_overmap(), place_vehicle_nearby(), pre_print_all_tile_info(), print_all_tile_info(), print_fields_info(), print_graffiti_info(), print_items_info(), print_terrain_info(), print_trap_info(), process_artifact(), prompt_dangerous_tile(), remoteveh(), save_maps(), serialize(), setup(), shift_monsters(), start_game(), start_hauling(), swap_critters(), try_get_left_click_action(), try_get_right_click_action(), update_map(), update_stair_monsters(), use_computer(), validate_camps(), validate_linked_vehicles(), validate_mounted_npcs(), vertical_move(), vertical_notes(), vertical_shift(), walk_move(), and zones_manager().

◆ main_ui_adaptor

weak_ptr_fast<ui_adaptor> game::main_ui_adaptor
private

◆ map_ptr

pimpl<map> game::map_ptr
private

Definition at line 947 of file game.h.

◆ memorial_logger_ptr

pimpl<memorial_logger> game::memorial_logger_ptr
private

Definition at line 957 of file game.h.

Referenced by game(), and memorial().

◆ monstairz

int game::monstairz = 0

Definition at line 984 of file game.h.

Referenced by update_stair_monsters(), and vertical_move().

◆ mostseen

int game::mostseen = 0

◆ moves_since_last_save

int game::moves_since_last_save = 0
private

Definition at line 1040 of file game.h.

Referenced by do_turn(), get_moves_since_last_save(), init_autosave(), quickload(), and quicksave().

◆ new_game

bool game::new_game = false

True if the game has just started or loaded, else false.

Definition at line 980 of file game.h.

Referenced by do_turn(), setup(), and start_game().

◆ next_mission_id

int game::next_mission_id = 0
private

Definition at line 1038 of file game.h.

Referenced by assign_mission_id(), serialize_master(), setup(), and unserialize_master().

◆ next_npc_id

character_id game::next_npc_id
private

Definition at line 1036 of file game.h.

Referenced by assign_npc_id(), serialize_master(), setup(), and unserialize_master().

◆ npcs_dirty

bool game::npcs_dirty = false
private

Has a NPC been spawned since last load?

Definition at line 1047 of file game.h.

Referenced by do_turn(), load_npcs(), and set_npcs_dirty().

◆ queue_screenshot

bool game::queue_screenshot = false

Definition at line 1019 of file game.h.

Referenced by do_turn().

◆ remoteveh_cache

vehicle* game::remoteveh_cache
private

Definition at line 1045 of file game.h.

Referenced by remoteveh(), setremoteveh(), and setup().

◆ remoteveh_cache_time

time_point game::remoteveh_cache_time
private

Definition at line 1044 of file game.h.

Referenced by remoteveh(), setremoteveh(), and setup().

◆ right_sidebar

bool game::right_sidebar = false

Definition at line 1015 of file game.h.

◆ safe_mode

◆ safe_mode_warning_logged

bool game::safe_mode_warning_logged = false
private

Definition at line 1034 of file game.h.

Referenced by check_safe_mode_allowed(), handle_action(), and set_safe_mode().

◆ scen

const scenario* game::scen

Definition at line 982 of file game.h.

Referenced by start_calendar(), and start_game().

◆ scent

scent_map& game::scent

Definition at line 965 of file game.h.

Referenced by display_scent(), do_turn(), serialize(), setup(), unserialize(), update_map(), and vertical_shift().

◆ scent_ptr

pimpl<scent_map> game::scent_ptr
private

Definition at line 951 of file game.h.

◆ seed

unsigned int game::seed = 0
private

Seed for all the random numbers that should have consistent randomness (weather).

Definition at line 1063 of file game.h.

Referenced by get_seed(), serialize_master(), start_game(), and unserialize_master().

◆ sFilter

std::string game::sFilter
private

Definition at line 1030 of file game.h.

Referenced by list_items(), and reset_item_list_state().

◆ show_panel_adm

bool game::show_panel_adm = false

Definition at line 1014 of file game.h.

Referenced by draw_panels(), and load_static_data().

◆ spell_events_ptr

pimpl<spell_events> game::spell_events_ptr
private

Definition at line 958 of file game.h.

Referenced by game(), and spell_events_subscriber().

◆ stats_tracker_ptr

pimpl<stats_tracker> game::stats_tracker_ptr
private

Definition at line 954 of file game.h.

Referenced by game(), serialize(), stats(), and unserialize().

◆ ter_view_p

tripoint game::ter_view_p

Definition at line 986 of file game.h.

Referenced by draw(), and draw_ter().

◆ tileset_zoom

int game::tileset_zoom = 0
private

How far the tileset should be zoomed out, 16 is default.

32 is zoomed in by x2, 8 is zoomed out by x0.5

Definition at line 1060 of file game.h.

Referenced by get_zoom(), look_around(), mouse_edge_scrolling_terrain(), reset_zoom(), set_zoom(), zoom_in(), and zoom_out().

◆ timed_event_manager_ptr

pimpl<timed_event_manager> game::timed_event_manager_ptr
private

Definition at line 952 of file game.h.

◆ timed_events

timed_event_manager& game::timed_events

Definition at line 966 of file game.h.

Referenced by do_turn(), natural_light_level(), and setup().

◆ token_provider_ptr

pimpl<drop_token_provider> game::token_provider_ptr

Definition at line 975 of file game.h.

Referenced by serialize(), setup(), and unserialize().

◆ turnssincelastmon

int game::turnssincelastmon = 0

Definition at line 1021 of file game.h.

Referenced by handle_action(), mon_info_update(), and setup().

◆ u

avatar& game::u

Definition at line 964 of file game.h.

Referenced by add_artifact_dreams(), add_npc_follower(), autopilot_vehicles(), cata_event_dispatch::avatar_moves(), butcher(), calc_driving_offset(), cancel_activity_or_ignore_query(), cancel_activity_query(), catch_a_monster(), centerlistview(), chat(), check_safe_mode_allowed(), cleanup_at_end(), control_vehicle(), create_starting_npcs(), critter_at(), critter_by_id(), death_screen(), disable_robot(), disp_NPCs(), display_scent(), do_turn(), draw(), draw_critter(), draw_critter_highlighted(), draw_critter_internal(), draw_hit_mon(), draw_line(), draw_look_around_cursor(), draw_minimap(), draw_panels(), draw_ter(), draw_trail_to_square(), draw_veh_dir_indicator(), drop(), drop_in_direction(), exam_vehicle(), examine(), extended_description(), find_nearby_items(), find_or_make_stairs(), fling_creature(), forced_door_closing(), fungal_effects::fungalize(), get_dangerous_tile(), get_player_base_save_path(), get_player_input(), get_veh_dir_indicator_location(), grabbed_furn_move(), grabbed_move(), grabbed_veh_move(), handle_action(), handle_key_blocking_activity(), inv_map_splice(), is_game_over(), is_hostile_within(), is_in_viewport(), item_action_menu(), knockback(), list_items(), list_items_monsters(), list_missions(), list_monsters(), load(), look_around(), mon_info(), mon_info_update(), monmove(), move_save_to_graveyard(), moving_vehicle_dismount(), npc_menu(), on_move_effects(), open_consume_item_menu(), overmap_npc_move(), peek(), perhaps_add_random_npc(), phasing_move(), pickup_feet(), place_player(), place_player_overmap(), print_all_tile_info(), print_creature_info(), print_items_info(), print_terrain_info(), print_trap_info(), process_activity(), process_artifact(), process_voluntary_act_interrupt(), prompt_dangerous_tile(), quickload(), remoteveh(), remove_npc_follower(), save(), save_player_data(), serialize(), set_driving_view_offset(), setremoteveh(), shared_from(), slip_down(), fungal_effects::spread_fungus_one_tile(), start_game(), start_hauling(), toggle_gate(), try_get_left_click_action(), try_get_right_click_action(), unserialize(), update_map(), update_overmap_seen(), update_stair_monsters(), use_computer(), validate_camps(), validate_npc_followers(), vertical_move(), vertical_notes(), vertical_shift(), walk_move(), win(), win_screen(), and zones_manager().

◆ u_ptr

pimpl<avatar> game::u_ptr
private

Definition at line 948 of file game.h.

◆ u_shared_ptr

shared_ptr_fast<player> game::u_shared_ptr
private

Definition at line 1025 of file game.h.

Referenced by shared_from().

◆ uquit

quit_status game::uquit

Used in main.cpp to determine what type of quit is being performed.

Definition at line 978 of file game.h.

Referenced by cleanup_at_end(), do_turn(), get_player_input(), handle_action(), is_game_over(), and setup().

◆ user_action_counter

int game::user_action_counter = 0
private

Definition at line 1057 of file game.h.

Referenced by get_user_action_counter(), and handle_action().

◆ w_minimap

catacurses::window game::w_minimap

Definition at line 990 of file game.h.

Referenced by create_or_get_main_ui_adaptor(), and draw_minimap().

◆ w_minimap_ptr

catacurses::window game::w_minimap_ptr
private

Definition at line 1028 of file game.h.

Referenced by create_or_get_main_ui_adaptor().

◆ w_omlegend

catacurses::window game::w_omlegend

Definition at line 989 of file game.h.

◆ w_overmap

catacurses::window game::w_overmap

Definition at line 988 of file game.h.

◆ w_pixel_minimap

catacurses::window game::w_pixel_minimap

◆ w_terrain

◆ w_terrain_ptr

catacurses::window game::w_terrain_ptr
private

Definition at line 1027 of file game.h.

Referenced by create_or_get_main_ui_adaptor().

◆ wait_popup

std::unique_ptr<static_popup> game::wait_popup
private

Definition at line 1076 of file game.h.

Referenced by do_turn().

◆ was_fullscreen

bool game::was_fullscreen = false

Definition at line 1017 of file game.h.

Referenced by load_static_data(), reenter_fullscreen(), and temp_exit_fullscreen().

◆ weather_manager_ptr

pimpl<weather_manager> game::weather_manager_ptr
private

Definition at line 960 of file game.h.

◆ zones_manager_open

bool game::zones_manager_open = false
private

Is Zone manager open or not - changes graphics of some zone tiles.

Definition at line 1053 of file game.h.

Referenced by is_zones_manager_open(), and zones_manager().


The documentation for this class was generated from the following files: